CMake多目录项目问题:头文件找不到且编译后无终端输出
CMake多目录C++项目问题解答
问题1:引入头文件提示“worker_manage.h: No such file or directory”
你的顶层可执行目标main没有配置include目录的编译路径。虽然你在src的库test中通过target_include_directories(test PUBLIC ${PROJECT_SOURCE_DIR}/include)设置了头文件路径,且用target_link_libraries(${PROJECT_NAME} PUBLIC test)链接了库,但这里的PUBLIC作用是让依赖main的其他目标继承test的头文件路径,main自身编译时并不会自动继承这个路径,导致编译main.cpp时找不到include目录下的头文件。
解决方法:在顶层CMakeLists.txt中,给main目标添加头文件目录配置:
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/include)
问题2:编译成功但终端无输出
这是Windows系统下共享库(DLL)的运行时依赖问题:
- 你通过
src目录的配置生成了共享库test.dll,并输出到lib目录;可执行文件main.exe则输出到bin目录。 - Windows运行可执行文件时,默认会在当前目录、系统目录等位置查找依赖的DLL,找不到
lib目录下的test.dll,导致程序直接启动失败,因此终端没有任何输出。
你修改代码后,把worker_manage.cpp直接加入可执行目标,相当于把该文件的代码直接编译进main.exe,不再依赖外部DLL,程序能正常启动并输出内容。
解决方法有三种:
- 方法一:统一输出目录,将
LIBRARY_OUTPUT_PATH和EXECUTABLE_OUTPUT_PATH都设置为${PROJECT_SOURCE_DIR}/bin,让DLL和EXE在同一目录。 - 方法二:运行程序前,手动将
lib目录下的test.dll复制到bin目录。 - 方法三:改用静态库,将
src目录CMakeLists.txt中的add_library(test SHARED ${SRC})改为add_library(test STATIC ${SRC}),编译时会把库代码直接链接到可执行文件中,无需单独的DLL。
内容的提问来源于stack exchange,提问作者joe qiu
相关产品推荐
相关产品推荐

