用cmake找不到共享库的API头文件。

问题描述 投票:0回答:1

我在一个项目中构建一个共享库,并在另一个项目中使用它。 它们共享一个前缀,但我没有把它们建在一起(例如。<prefix>/mylib<prefix>/myproject). 两者 mylibmyprojectsrcinclude 目录。

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.somylib.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.

c cmake shared-libraries
1个回答
0
投票

你需要为 "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 输出库的教程。

© www.soinside.com 2019 - 2024. All rights reserved.