【问题标题】:CMake subdir library and main projectCMake 子目录库和主项目
【发布时间】:2015-03-11 17:05:02
【问题描述】:

这是一个例子,我今天用谷歌搜索了很多,但我找不到完成这件事的好方法。

例如,我遵循了此链接中所写的内容:http://mirkokiefer.com/blog/2013/03/cmake-by-example/

我有

/Build
/Src
 => main.c
  /Lib
      => File.c
      => File.h

我在 Src 目录中有一个 CMakeLists.txt

SET(SOURCES
    main.c
)
add_subdirectory(Lib)
ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCES})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} lib)

在 Lib 目录中:

set(LibSrc
    File.c
)
set(LibHead
    File.h
)
add_library(lib STATIC ${LibSrc} ${LibHead})
target_include_directories(lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

当我编译项目时,一切都正确编译,但是当 gcc 将库与项目的其余部分链接时,我收到如下错误:

main.cpp:(.text+0x10): undefined reference to `test()`

这让我发疯......关于我做错了什么的任何提示?谢谢

【问题讨论】:

  • make VERBOSE=1 的输出是什么?

标签: c gcc cmake


【解决方案1】:

您的target_link_libraries 命令似乎缺少依赖项列表。我想在你的情况下,你只想链接“lib”,所以你需要把它改成:

target_link_libraries(${PROJECT_NAME} lib)

顺便说一句,您在行中{CMAKE_CURRENT_SOURCE_DIR} 之前缺少$

target_include_directories(lib PUBLIC {CMAKE_CURRENT_SOURCE_DIR})

【讨论】:

  • 是的,你说的都是对的。但实际上它们只是代码复制和粘贴过程中的拼写错误。这是一个更复杂的 CMakeLists.txt 的 sn-p 我将编辑我的问题并更正拼写错误。感谢您注意到他们。
  • OK - 但target_link_libraries仍然错误!在子目录“Lib”中定义的目标实际上是lib,而不是Lib。除此之外,您的设置看起来不错。如果是这样,那么也许您实际上没有在任何地方定义 test() - 只是声明了它?
  • 在.c文件中定义。我看到它并编译。如果我从 target_link_libraries 中删除库,则可以从库外部看到标头,gcc 会抱怨它看不到头文件的事实。
  • 看起来 cmake 构建目录有问题。我删除它并重新启动构建,一切正常。链接部分工作正常。
猜你喜欢
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多