【发布时间】:2020-04-27 17:45:20
【问题描述】:
我正在一个项目中构建一个共享库并在另一个项目中使用它。它们共享一个前缀,但我没有将它们构建在一起(例如,<prefix>/mylib 和 <prefix>/myproject)。 mylib 和 myproject 都有 src 和 include 目录。
共享库的CMakeList.txt:
cmake_minimum_required(VERSION 3.5)
project(mylib)
add_library(mylib SHARED
src/mylib.c
)
target_include_directories(mylib PRIVATE include)
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
install(TARGETS
mylib
LIBRARY DESTINATION lib
PUBLIC_HEADER DESTINATION include
RUNTIME DESTINATION bin)
这导致mylib.so 安装在install/mylib/lib/mylib.so 中,mylib.h 安装在install/mylib/include/mylib.h 中,这正是我的意图。
然后我想构建一个使用mylib的项目:
#include "mylib.h"
int main(void)
{
// use some functions in mylib
}
main.c 的关联 CMakeList.txt 文件:
cmake_minimum_required(VERSION 3.5)
project(myproject)
find_package(mylib REQUIRED)
add_executable(myproject src/main.c)
target_link_libraries(myproject mylib)
install(TARGETS
myproject
DESTINATION lib/${PROJECT_NAME})
这会产生:
main.c: fatal error: mylib.h: No such file or directory
#include "mylib.h"
^~~~~~~~~
如果我将 CMakeList.txt 更改为包含以下内容:
find_path(MYLIB_INCLUDE_DIR mylib.h)
...
target_include_directories(myproject PUBLIC ${MYLIB_INCLUDE_DIR})
然后它找到标题,但没有找到库。我收到链接器错误:
/usr/bin/ld: cannot find -lmylib
如果我将 CMakeList.txt 更改为包含以下内容:
find_library(MYLIB_LIB mylib)
...
target_link_libraries(myproject ${MYLIB_LIB})
然后构建。
我(想我)理解为什么手动查找库和包含文件是可行的,但这似乎是错误的处理方式......
find_package(mylib) 似乎确实找到了mylib 包(我可以打印cmake 缓存变量和mylib_FOUND=1),但没有找到使用myproject 构建的库和标头。
【问题讨论】:
-
"
find_package(mylib)似乎确实找到了mylib包" - 它确实找到了,否则 CMake 会在配置期间发出错误消息。但是不清楚你如何定义这个包。它应该是一个脚本,可以是mylibConfig.cmake或Findmylib.cmake,由find_package(mylib)调用执行。 CMake 能够为您的mylib项目生成mylibConfig.cmake。但是您在该项目中的CMakeLists.txt在install(TARGETS)调用中不包含EXPORT关键字,它不包含install(EXPORT)命令。 -
你是对的。我需要使用 EXPORT。如果您将其更改为答案,我会接受。也许也可以指向this answer,在你让我朝着正确的方向前进后,我发现它非常有帮助。
标签: c cmake shared-libraries