我在一个项目中构建一个共享库,并在另一个项目中使用它。 它们共享一个前缀,但我没有把它们建在一起(例如。<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
}
相关人员: CMakeList.txt
归档 main.c
:
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
.
你需要为 "build "和 "install "两个变体在 target_include_directories
在你的库项目中。
target_include_directories(mylib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> # build variant
$<INSTALL_INTERFACE:include> # install variant
)
另外,这样的例子在文档中提供了 target_include_directories 命令。
此外,您还需要 EXPORT
在安装过程中的库。
install(
TARGETS mylib
EXPORT mylib
LIBRARY DESTINATION lib
PUBLIC_HEADER DESTINATION include
RUNTIME DESTINATION bin)
请看 本回答 以获得使用 cmake 输出库的教程。