簡體   English   中英

使所有項目(子目錄)都可以訪問文件夾中的所有文件

[英]Make all files in a folder accessible to all projects (subdirectories)

我的存儲庫中有多個項目(子目錄)。 所有項目只有一個名為main.cpp的可執行文件,它們都使用common文件夾中的庫和#include語句。 文件夾結構如下所示:

root
|
├────common
|    ├──── example.h
|    ├──── example.cpp
|    ├──── *.h          # many header files
|    └──── *.cpp        # many source files
|
├────Project_A
|    ├──── CMakeLists.txt
|    └──── main.cpp
|
├────Project_B
|    ├──── CMakeLists.txt
|    └──── main.cpp
|
└──── CMakeLists.txt

這是我編寫根目錄的 CMakeLists.txt 的嘗試

cmake_minimum_required (VERSION 3.8)
project ("root")

file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
link_libraries(${CommonLibs})

add_subdirectory ("Project_A")
add_subdirectory ("Project_B")

Project_A 的 CMakeLists.txt

cmake_minimum_required (VERSION 3.8)
add_executable (Project_A "main.cpp")

Project_B 的 CMakeLists.txt

cmake_minimum_required (VERSION 3.8)
add_executable (Project_B "main.cpp")

但是,在運行任何項目時,我都會收到此錯誤:

LNK1107 invalid or corrupt file: cannot read at 0x7AC, file example.h

我不相信該文件已損壞,因為在我嘗試在 root 的 CMakeLists.txt 中使用link_libraries()之前,我遇到了其他錯誤:

Unresolved external symbol SomeNamespace::ExampleClass::ExampleClass(bool)

可能的重復

諸如此類的其他問題並不能解決我的問題,因為它們通常使用更復雜的文件夾結構。 還有一些問題試圖只針對像這樣的單個項目,但我有多個項目。

你能提供一個簡潔的解決方案嗎?

CMakeLists.txt添加到您的common/目錄:

root
|
├────common
|    ├──── CMakeLists.txt <-------- Add this
|    ├──── example.h
....

常見/CMakeLists.txt

file(GLOB_RECURSE CommonLibsFiles ${CMAKE_CURRENT_SRC_DIR}/*.cpp)
add_library(CommonLibs ${CommonLibsFiles})
...

根的 CMakeLists.txt

...

### NO NEED FOR THESE
file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
link_libraries(${CommonLibs})
###

add_subdirectory(common) #CommonLibs will now be visible to children directories
...

現在根據需要鏈接庫。 例如項目 A

Project_A 的 CMakeLists.txt

cmake_minimum_required (VERSION 3.8)
add_executable (Project_A "main.cpp")
target_link_libraries(Project_A PRIVATE CommonLibs) #link to common libs here,

cmake 文件創建或可見的所有目標/變量對子文件可見。 反過來卻不正確。 為了讓孩子向父母公開他們的變量,他們需要明確指定PARENT_SCOPE

您的頂級 CMake 中的以下行沒有多大意義:

file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
link_libraries(${CommonLibs})

link_libraries()命令接受庫目標,而不是變量(例如CommonLibs )。 您可以使用CommonLibs變量定義一個新的庫目標,然后使用link_libraries()將庫目標鏈接到您的可執行文件:

file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
# Add this line.
add_library(MyCommonLib SHARED ${CommonLibs})
link_libraries(MyCommonLib)

請注意,通常不鼓勵使用link_libraries() ,即使在 CMake 文檔本身中也是如此。 您應該更喜歡使用target_link_librariesMyCommonLib鏈接到需要它的特定可執行文件。

target_link_libraries(Project_A PRIVATE MyCommonLib)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM