创建一个封装其他2个项目的可执行文件

Creating an executable encapsulating 2 other projects

本文关键字:2个 其他 项目 可执行文件 封装 一个 创建      更新时间:2023-10-16

我在Eclipse c++中工作。在我的项目中有这样的结构:

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时,我有这个奇怪的错误出现在B项目上面的2行,这使得我的构建失败:

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

当我注释这些行并重建B项目TestB项目时,它工作得很好,我在B项目中有一个库,在TestB.

中有一个。exe。

我不明白我的问题在哪里

B依赖于A,因此将B的CMakeLists.txt中的依赖添加到A与target_link_libraries。即使它是一个静态库,当你构建B时不会有任何实际的链接,这无论如何都会给CMake一个提示,每次你链接B到可执行文件时,你也必须链接之后A。在链接命令行中,A必须位于B之后,以便在链接到A时知道B所需的符号。

如果您正在寻找快速修复,只需更改:

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

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