CMake动态构建库作为子目录并链接到主可执行文件

lxkprmvk  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(355)

我不太擅长CMake,所以我试图创建一个我想要实现的极简示例。
我想写一个库,它与我的主项目一起编译,然后动态链接到我的项目可执行文件。
这是我的测试项目文件系统:
x1c 0d1x的数据
CMakeLists.txt:

  1. cmake_minimum_required(VERSION 3.13)
  2. project(TestProject)
  3. add_subdirectory(lib_wrapper)
  4. add_executable(TestExe main.cpp)
  5. target_link_libraries(TestExe libwrapper)
  6. target_include_directories(TestExe PUBLIC ../lib_wrapper)
  7. target_include_directories(TestExe PUBLIC ../src)

字符串
lib_wrapper/CMakeLists.txt:

  1. add_library (wrapper wrapper.cpp)
  2. target_include_directories (wrapper PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})


src/main.cpp:

  1. #include <src/a_header.h>
  2. int main()
  3. {
  4. int j = 0;
  5. return 0;
  6. }


src/a_header.h:

  1. #pragma once
  2. #include <lib_wrapper/wrapper.h>
  3. #include <iostream>
  4. inline void some_func()
  5. {
  6. std::cout << "some_func()" << std::endl;
  7. // Call a function from lib_wrapper/wrapper.h
  8. }


cmake ..成功地为主项目生成。但是,当我在文件夹Testmake时,我得到:

  1. Test/main.cpp:3:10: fatal error: src/a_header.h: No such file or directory
  2. 3 | #include <src/a_header.h>


有人能帮帮忙吗?欢迎任何改进的建议。

ujv3wf0j

ujv3wf0j1#

在构建TestExe目标时,根文件夹Test不在包含目录列表中。
一种方法是将${CMAKE_SOURCE_DIR}添加到target_include_directories(TestExe PUBLIC ...行的末尾,在)之前,或者您可能希望将其替换为:

  1. target_include_directories(TestExe PRIVATE
  2. ${CMAKE_SOURCE_DIR}
  3. ../lib_wrapper
  4. .
  5. )

字符串
我将PUBLIC更改为PRIVATE,因为通常可执行目标不会被其他目标继承,因此不需要与其他目标共享包含目录。
你的第二个错误是@Tsyvarev在评论中提到的:

  1. target_link_libraries(TestExe libwrapper)


这应该是

  1. target_link_libraries(TestExe wrapper)


因为您库目标名称是wrapper:

  1. add_library (wrapper wrapper.cpp)

展开查看全部

相关问题