2017-09-25 105 views
2

在使用cmake的項目中,我構建了兩個版本的庫,一個是靜態的,一個是動態鏈接的。對於單個源文件,我只想在編譯共享庫時傳遞不同的編譯定義(即-Dfoo=bar)。CMake:靜態和共享庫的不同編譯定義

我知道set_target_properties我可以使用COMPILE_DEFINITIONS作爲單一來源,但我不知道如何只爲共享庫添加該定義。

這怎麼辦?

編輯

要弄清這個問題,怎麼是不同的,我已經做了同一個庫的兩個版本。

add_library(static_lib STATIC foo.cpp bar.cpp) 
add_library(dyn_lib SHARED foo.cpp bar.cpp) 

我想要做的是增加對dyn_lib編譯foo.cppfoo.cpp編譯時-Dbaz=True target屬性。

+1

我在很多項目中看到的常見模式是有2個目標 - 靜態庫和共享目標。有了2個目標,你可以爲它們設置不同的標誌。 – arrowd

+0

@arrowd我對cmake很無知。我只知道如何將add_library($ {lib_name}(STATIC | SHARED)$ {源列表})添加到庫中。你的意思是在源文件的名稱和add_library命令之間進行一定程度的間接尋址? –

+1

我的意思是,你應該對'add_library()'進行2次調用 - 一個用於靜態庫,另一個用於共享。 – arrowd

回答

1

dyn_lib編譯的對象添加定義-Dbaz=True最簡單的方法是使用target_compile_definition()

target_compile_definition(dyn_lib PRIVATE -Dbaz=True) 

這實際上是設置COMPILE_DEFINITIONS屬性dyn_lib目標的一個較短的版本。

set_target_properties(dyn_lib PROPERTIES COMPILE_DEFINITIONS -Dbaz=True) 
+0

這個定義了所有被編譯到'dyn_lib'的源文件的'baz'。我將如何爲單一來源定義'baz'? –