【问题标题】:CMake add_subdirectory with find_package?CMake add_subdirectory 与 find_package?
【发布时间】:2015-11-13 16:33:02
【问题描述】:

我有以下项目/来源结构:

MyProject
|-MyProject
| |-src
| | |-project.c
| |
| |-CMakeLists.txt
|
|-MyLibrary
  |-include
  | |-hello.h
  |
  |-src
  | |-hello.c
  |
  |-CMakeLists.txt

MyProject/src/project.c 包括 MyLibrary/include/hello.h,而后者又包括来自系统的 libusb.h(使用 CMake 找到)。

我正在使用以下代码在 MyLibrary/CMakeLists.txt 中添加 libusb 依赖项:

# Find libusb
find_package(LibUsb REQUIRED)

# Include libusb
include_directories(${LIBUSB_INCLUDE_DIR})

# Add dependencies
target_link_libraries(owi535 ${LIBUSB_LIBRARY})

但是,在编译 MyProject(包括使用 add_subdirectory 和 target_link_libraries 的 MyLibrary)时,我收到一条错误消息,指出找不到 libusb.h。

我可以自己编译MyLibrary,但是编译MyProject 需要libusb.h 在它的包含路径中,但它不是。

有没有办法通过添加MyLibrary 作为依赖项,MyProject 拉动libusb.h 通过它?这意味着我不需要为每个包含MyLibrary 的项目重复find_package 代码。


我遇到的另一个问题是类似的;当我编译MyProject 时,在MyLibrary 中调用libusb 函数时出现Undefined symbols 错误,但是当我自己编译MyLibrary 时,没有错误。

Undefined symbols for architecture x86_64:
  "_libusb_close", referenced from:
      _my_close_method in libMyLibrary.a(hello.c.o)
  "_libusb_exit", referenced from:
      _my_exit_method in libMyLibrary.a(hello.c.o)
  "_libusb_init", referenced from:
      _my_init_method in libMyLibrary.a(hello.c.o)
  "_libusb_open_device_with_vid_pid", referenced from:
      _my_open_method in libMyLibrary.a(hello.c.o)
ld: symbol(s) not found for architecture x86_64

【问题讨论】:

    标签: c cmake


    【解决方案1】:

    来自cmake documentation:

    PUBLIC 和 INTERFACE 项目将填充 的 INTERFACE_INCLUDE_DIRECTORIES 属性。

    目标可以填充此属性 [INTERFACE_INCLUDE_DIRECTORIES] 以发布针对目标的标头进行编译所需的包含目录。消费目标可以在自己的INCLUDE_DIRECTORIES property中添加条目如$<TARGET_PROPERTY:foo,INTERFACE_INCLUDE_DIRECTORIES>来使用foo接口中指定的include目录。

    所以,你需要在MyLibrary/CMakeLists.txt中使用这个:

    target_include_directories(MyLibrary PUBLIC ${LIBUSB_INCLUDE_DIR})
    

    【讨论】:

    • 我在链接实际库时遇到了同样的问题。在编译MyProject 时获得与libusb 相关的Undefined symbols,但MyLibrary 可以自行编译。有类似的解决方法吗?
    • 这是一个单独的问题。您可以重新接受此答案并在新问题中打开一个新问题。
    • 但是要回答你的问题,看起来你实际上并没有正确地将 libusb 库链接到 MyLibrary。直接编译 MyLibrary 不会出错,因为看起来您正在使用静态链接。
    • 我认为@jackwilsdon 第二个问题看起来像是错字。会不会是LIBUSB_LIBRARIES 而不是LIBUSB_LIBRARY?例如。如果我看How to set LIBUSB_INCLUDE_DIR
    猜你喜欢
    • 2018-07-08
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多