私はEclipse C++でWindows上で作業しています。ファイルには、私が持っている、私のBサブプロジェクトで実行可能ファイルを作成して他の2つのプロジェクトをカプセル化する
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)
:
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です:私は私のプロジェクトでは、この構造を持っていますこの:
#include "A.hpp"
...
A algo;
A.method(parameters)
私はTESTBを構築するとき、私はAB 2行にBプロジェクトに登場する、この奇妙なエラーが発生しています私のビルドは失敗しますOVE:
undefined reference to A::A()
undefined reference to A::method(parameter)
私はこれらの行をコメントアウトしてBプロジェクトとTESTBプロジェクトそれが正常に動作を再構築するとき、私はBプロジェクトのライブラリとで.exeファイルを持っていますTestB。
私はどこに問題があるのか分かりません。
にあなたが 'A'を使用する場合は、プロジェクトの静的ライブラリとリンクする必要があります生成する。 – StoryTeller
私はそれをどこにリンクするのか、それをどう理解できませんでした。私のCmakeList.txtに? 'link_directories($ {CMAKE_CURRENT_SOURCE_DIR} /../../ install/$ {CMAKE_BUILD_TYPE}/A/lib)'コマンドは既にそれをリンクしていますか? – user3314570
静的ライブラリが構築されている場所はどこですか? 2つの 'link_directories'コマンドを1つにすることをお勧めします。それは[cmakeのドキュメントが行うこと](https://cmake.org/cmake/help/v3.0/command/link_directories.html)です。 2番目のコールが最初のコールをスローしている可能性があります。 – StoryTeller