我是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)
我编译这个项目并运行它。所以我只得到输出&#34; Hello,world!&#34;。
当我删除评论(main.cpp
第5行)时,会使用ClassA
的实例。所以我也得到了类Creator
的输出。 ClassA
的代码已链接
当我将类ClassA
移动到根目录时,它也可以工作。
我还尝试将PUBLIC_LINK
,debug
和general
等参数用于target_link_libraries。但没有任何作用。
我打算在这个main.cpp文件中使用Collection Class,并从集合中获取instanced对象。在main.ccp文件中,我不想知道每个实例类,因为所有类ClassA
... ClassZ都具有相同的接口(本例中未显示)。
我如何强制&#34;未使用&#34;的链接?码?
编辑:不知道是否有必要。我使用KDevelop4。
答案 0 :(得分:0)
请参阅How to force gcc to link an unused static library
我已经使用GNU 4.8.1编译器测试了您的代码,在您的示例中,只需将您的target_link_libraries()
行替换为:
target_link_libraries(
teststaticcmake
PRIVATE
"-Wl,--whole-archive"
SubFolder
"-Wl,--no-whole-archive"
)
来自target_link_libraries()
documentation:
- 链接标志:以 - ,但不是-l或-framework开头的项目名称被视为链接器标志。请注意,出于传递依赖性的目的,此类标记将被视为任何其他库链接项,因此通常只能将其指定为不会传播给依赖项的私有链接项。
更多参考资料