私はCMakeを初めて使用し、プロジェクトをコンパイルしようとしています。プロジェクトは、いくつかの静的ライブラリといくつかの実行可能ファイルを作成します。
以下は私が持っているファイル構造の例です。
事業
SRC
- subProject_1
.cpp(すべてのソースファイル)およびこのフォルダーのCMakeLists.txt 1(静的ライブラリの作成) - subproject_2
.cpp(すべてのソースファイル)およびこのフォルダーのCMakeLists.txt 2(静的ライブラリの作成) - subproject_3
.cpp(すべてのソースファイル)およびこのフォルダーのCMakeLists.txt 3(実行可能ファイルの作成)
- subProject_1
含む
- subProject_1
.h(すべてのヘッダーファイル) - subProject_2
.h(すべてのヘッダーファイル) - subProject_3
.h(すべてのヘッダーファイル)
- subProject_1
ビルド/Linux
- CMakeLists.txt(メインCMakelistファイル)
メインCMakeLists.txt
cmake_minimum_required(VERSION 2.6)
SET(CMAKE_CXX_COMPILER "g++")
Project(ort)
SET (CMAKE_CXX_FLAGS " -g -Wall -pThread")
#set the source and header directories location
set(ORT_HEADER_DIRECTORY "../../include") #include folder structure explained above
set(ORT_SOURCE_DIRECTORY "../../src")
set(ORT_BINARY_DIRECTORY "../../lib") # lib folder to contain all the libraries
set (CMAKE_CURRENT_BINARY_DIR ".")
#Include the library packages
include_directories("/usr/include/wx-2.8")
include_directories("/usr/local/cuda/include") and so on
#set the names of all the projects (for creating the libraries)
SET(PROJECT_NAMES "log" "data" "cc")
foreach(PROJECT_NAME ${PROJECT_NAMES})
# Create the cmake related files in the out folder so that the libraries can be
# copied to the lib folder
add_subdirectory( "{ORT_SOURCE_DIRECTORY}/${PROJECT_NAME}" "${CMAKE_CURRENT_BINARY_DIR}/out/${PROJECT_NAME}"
endforeach(PROJECT_NAME ${PROJECT_NAMES})
#set the names of all the projects (for creating the libraries)
SET(EXECUATALE_PROJECTS "metadata" )
foreach(EXECUATALE_PROJECT ${EXECUATALE_PROJECTS})
# Create the cmake related files in the out folder so that the libraries can be
# copied to the lib folder
add_subdirectory( "{ORT_SOURCE_DIRECTORY}/${EXECUATALE_PROJECT}" "${CMAKE_CURRENT_BINARY_DIR}/out/${EXECUATALE_PROJECT}"
endforeach(EXECUATALE_PROJECT ${EXECUATALE_PROJECTS})
ログディレクトリ用のCMakeLists.txtファイル(ccおよびデータプロジェクトに使用したのと同じロジック)
include_directories(${ORT_HEADER_DIRECTORY})
SET(LOG_SOURCE a.cpp b.cpp c.cpp)
ADD_LIBRARY(log_d ${LOG_SOURCE})
target_link)libraries(log_d cc_d data_d)
メタデータCMakeLists.txtファイル(実行可能プロジェクトの作成)
FIND_PACKAGE(wxWidgets)
IF(wxWidgets_FOUND)
INCLUDE(${wxWidgets_USE_FILE})
ENDIF(wxWidgets_FOUND)
Include_Directories(${wxWidgets_INCLUDE_DIRS})
include_directories(${ORT_HEADER_DIRECTORY})
include_directories("/usr/ort/lib/unixODBC/include")
SET(META_SOURCE meta.cpp data.cpp)
ADD_EXECUTABLE(meta_d ${META_SOURCE })
TARGET_LINK_LIBRARIES(meta_d log_d data_d)
実行可能ファイルを作成せずにプロジェクトを作成するだけで、静的ファイルが生成されます。しかし、プロジェクト全体を作成すると(つまり、subProject_3ディレクトリを含めると)、a.cppa::String
の関数である未定義の参照が取得されます。
注:3つのプロジェクトはすべて相互に依存しています。たとえば、a.cppにはが#include "b.h"
あり、b.cppにはがあり#include "a2.h"
ます。
だから、私はいくつかの質問があります:
a)未定義の参照の問題を解決するにはどうすればよいですか?プロジェクト1と2のライブラリを生成したら、これらを実行可能ファイルにリンクするにはどうすればよいですか?
b)静的ライブラリを作成するときに依存関係を提供または追加する必要がありますか?これは静的ライブラリを作成する正しい方法ですか(プロジェクトは相互に依存しているため)?つまりtarget_link_libraries(project1 project2 ...)
、プロジェクト1とtarget_link_libraries(project2 project1 ...)
プロジェクト2です。
c)すべてのプロジェクトは、独自のコンパイル設定でコンパイルする必要があります。個々のプロジェクトごとに同じものを指定するにはどうすればよいですか?
エラーの詳細:
CXX実行可能ファイルのメタデータが好きです../log/liblog_d.a:ファイルが認識されません:ファイルが切り捨てられましたcollect2:ldが1つの終了ステータスを返しました
また、未定義の参照エラー/home...../metadata/data.cpp 172:xmlSerahNsへの未定義の参照などが発生します。collect2:ldが1つの終了ステータスを返しました
助けてくれてありがとう。