【问题标题】:Creating an executable encapsulating 2 other projects创建一个封装了其他 2 个项目的可执行文件
【发布时间】:2017-01-12 15:36:27
【问题描述】:

我正在使用 Eclipse C++ 开发 Windows。我的项目中有这个结构:

subProject A
   -> creates a static library (works fine)
subProject B encapsulating subproject A
   -> creates a static library (works fine)
subProject TestA
   -> creates an executable (works fine)
subProject TestB
    |dev
      |src
      | CmakeList.txt
    |CmakeList.txt
   -> creates an executable (doesn't work)

这是 TestB 可执行文件的 dev 目录中的 CmakeList.txt

set(${PROJECT_NAME}_INCLUDE_DIRS
    $(CMAKE_CURRENT_SOURCE_DIR}/src
    CACHE STRING "" FORCE)

include_directories(${${PROJECT_NAME}_INCLUDE_DIRS})

file(GLOB_RECURSE ${PROJECT_NAME}_HEADER_FILES FOLLOW_SYMLINKS
  ./*.hpp
  ./*.h)

file(GLOB_RECURSE ${PROJECT_NAME}_SORUCE_FILES FOLLOW_SYMLINKS
  ./*.cpp
  ./*.c)

set(${PROJECT_NAME}_FILES ${${PROJECT_NAME}_HEADER_FILES}
    ${${PROJECT_NAME}_SOURCE_FILES})

# Additional includes and link directories and dependencies
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/A/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/B/include)

if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES}
                     A
                     B
                     pthread)
elseif(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES}
                     A
                     B
                     pthread)
endif()

# Add a library to the project
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/A/lib)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/B/lib)

add_executable(${PROJECT_NAME} ${${PROJECT_NAME}_FILES})

target_link_libraries(${PROJECT_NAME} ${${PROJECT_NAME}_EXTRA_LIBRARIES})

install(FILES ${${PROJECT_NAME}_HEADER_FILES}
     DESTINATION ${CMAKE_INSTALL_PREFIX}/include/
     PERSMISSIONS OWNER_READ GROUP_READ WORLD_READ)

install(TARGETS ${PROJECT_NAME}
     ARCHIVE DESTINATION lib
     LIBRARY DESTINATION lib
     RUNTIME DESTINATION bin)

在我的 B 子项目中,在一个文件中,我有这个:

#include "A.hpp"

...
A algo;
A.method(parameters)

当我构建我的 TestB 时,我在上面 2 行的 B 项目 中出现了这个奇怪的错误,这导致我的构建失败:

undefined reference to A::A()
undefined reference to A::method(parameter)

当我评论这些行并重建 B 项目TestB 项目 时,它工作正常,我在 B 项目中有一个库,在 TestB 中有一个 .exe .

我不明白我的问题出在哪里。

【问题讨论】:

  • 如果使用A,则需要链接项目A生成的静态库。
  • 我不太明白在哪里链接它以及如何链接它。在我的 CmakeList.txt 中? link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/A/lib) 命令不是已经链接了吗?
  • 不知道,这是静态库的构建和位置吗?我还建议您尝试将两个link_directories 命令合二为一。这就是cmake documentation does。可能是第二个调用丢弃了第一个。

标签: c++ eclipse cmake executable


【解决方案1】:

B 依赖于A,因此将B 的CMakeLists.txt 中的依赖添加到带有target_link_libraries 的A 中。即使它是一个静态库并且在您构建 B 时不会有任何实际链接,这无论如何都会向 CMake 提示每次将 B 链接到可执行文件时,您还必须链接 之后AA 必须在链接命令行中的 B 之后,以便在链接到 A 时知道 B 所需的符号。详情请见here

如果您正在寻找快速解决方案,只需更改:

set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES}
                     A
                     B
                     pthread)

到这里

set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES}
                     B
                     A
                     pthread)

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 2012-08-17
    • 1970-01-01
    • 2014-07-03
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多