【问题标题】:CMake link not subfolderCMake链接不是子文件夹
【发布时间】:2015-11-14 14:04:25
【问题描述】:

我是 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 等参数用于target_link_libraries。但没有任何效果。

我打算在这个 main.cpp 文件中使用一个集合类并从集合中获取实例化对象。在 main.ccp 文件中,我不想知道每个实例类,因为所有类 ClassA ... ClassZ 都具有相同的接口(本示例中未显示)。

如何强制链接“未使用”代码?

编辑:不知道是否有必要。我用的是KDevelop4。

【问题讨论】:

    标签: c++ linker cmake


    【解决方案1】:

    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,被视为链接器标志。请注意,出于传递依赖的目的,此类标志将被视为与任何其他库链接项一样,因此通常仅将它们指定为不会传播给依赖项的私有链接项是安全的。

    更多参考资料

    【讨论】:

      猜你喜欢
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      相关资源
      最近更新 更多