2015-11-14 130 views
1

我是cmake的新手。CMake鏈接不是子文件夾

我想創建代碼來創建一些類的實例(如ClassA)並將它們收集到一個處理程序類中。爲此,我創建了一個模板類Creator。 在每個類實現中,此類的一個實例是使用Creator類創建的。 (見ClassA.cpp第8行)

我具有以下的文件夾結構

├── CMakeLists.txt 
├── main.cpp 
└── SubFolder 
    ├── ClassA.cpp 
    ├── ClassA.h 
    ├── CMakeLists.txt 
    └── Creator.h 

./main.cpp

#include <iostream> 
#include "SubFolder/ClassA.h" 

int main(int argc, char **argv) { 
    //classA a; 

    std::cout << std::endl << "Hello, world!" << std::endl; 
    return 0; 
} 

./CMakeLists.txt

cmake_minimum_required(VERSION 2.8) 
project(teststaticcmake) 

add_executable(teststaticcmake main.cpp) 
add_subdirectory(SubFolder) 
target_link_libraries(teststaticcmake SubFolder) 

install(TARGETS teststaticcmake RUNTIME DESTINATION bin) 

子目錄/ ClassA.h

#ifndef __CLASSA__ 
#define __CLASSA__ 

class classA 
{ 
    public: 
     classA(); 
}; 
#endif //__CLASSA__ 

子文件夾/ ClassA.cpp

#include "ClassA.h" 
#include "Creator.h" 

classA::classA() 
{ 
} 

classA* pClassA = Creator<classA>::create(); 

子文件夾/ Creator.h

#ifndef __CREATOR__ 
#define __CREATOR__ 

#include <iostream> 

template<typename T> 
class Creator 
{ 
    public: 
     static T* create() 
     { 
      T* p = new T(); 

      // Do Something here 
      // ... like output 
      std::cout << std::endl << "created: " << p; 

      return p; 
     } 
}; 
#endif //__CREATOR__ 

子文件夾/的CMakeLists.txt

add_library(SubFolder ClassA.cpp) 

我編譯該項目並運行它。所以我只得到輸出「你好,世界!」。
當我刪除評論(main.cpp第5行)時,使用ClassA的實例。所以我也得到類Creator的輸出。代碼ClassA已鏈接。
當我將類ClassA移動到根目錄時,它也可以工作。

我也嘗試使用參數,如PUBLIC_LINKdebuggeneral for target_link_libraries。但沒有任何工作。

我打算在這個main.cpp文件中使用Collection類,並從集合中獲取實例化對象。在main.ccp文件中,我不想知道每個實例類,因爲所有類ClassA ... ClassZ具有相同的接口(本例中未顯示)。

如何強制「未使用」代碼的鏈接?

編輯:不知道它是否必要。我使用KDevelop4。

回答

0

How to force gcc to link an unused static library

我已經與GNU 4.8測試你的代碼。

target_link_libraries(
    teststaticcmake 
    PRIVATE 
     "-Wl,--whole-archive" 
     SubFolder 
     "-Wl,--no-whole-archive" 
) 

target_link_libraries()documentation:1個編譯器和在你的例子只是更換您target_link_libraries()

  • 鏈接標誌:項目名稱開頭的 - 而不是-l或 - 框架,被視爲鏈接器標誌。請注意,爲了傳遞依賴關係,這些標誌將像其他任何庫鏈接項目一樣處理,因此它們通常是安全的,只能指定爲不會傳播給依賴項的專用鏈接項目。

更多參考