Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在静态库中的单独cpp文件中链接未引用的变量?_C++_Xcode_Gcc - Fatal编程技术网

C++ 如何在静态库中的单独cpp文件中链接未引用的变量?

C++ 如何在静态库中的单独cpp文件中链接未引用的变量?,c++,xcode,gcc,C++,Xcode,Gcc,下面是“init.cpp”中的类定义: 我刚刚将这个cpp添加到一个静态库中,并将这个库引用到我的项目中,但是cnetit的构造函数永远无法执行,因为没有对这个cpp的引用。我如何才能使它工作,而不添加一些无用的参考,这个cpp只是为了导入这个单位 注释:事实上,这只是一个示例,我的代码将在xcode和gcc中编译,是否有任何标准或非标准方法(如编译器选项)可以做到这一点?您必须编译此文件并将输出与其他目标文件链接在一起。这是将其中定义的变量添加到应用程序中的唯一方法。您必须编译此文件,并将输出

下面是“init.cpp”中的类定义:

我刚刚将这个cpp添加到一个静态库中,并将这个库引用到我的项目中,但是cnetit的构造函数永远无法执行,因为没有对这个cpp的引用。我如何才能使它工作,而不添加一些无用的参考,这个cpp只是为了导入这个单位


注释:事实上,这只是一个示例,我的代码将在xcode和gcc中编译,是否有任何标准或非标准方法(如编译器选项)可以做到这一点?

您必须编译此文件并将输出与其他目标文件链接在一起。这是将其中定义的变量添加到应用程序中的唯一方法。

您必须编译此文件,并将输出与其他对象文件链接在一起。这是将其中定义的变量添加到应用程序中的唯一方法。

库的全部要点是,仅在必要时才包括其中的模块。表明模块是必需的规范方法是使用模块中定义的某个名称进行ODR

如果您希望无条件地将模块链接到可执行文件中,那么(在大多数构建系统上)只需将编译模块的文件名添加到要链接到最终可执行文件的文件名列表中即可。这意味着每次添加新模块时都要修改构建说明

如果您希望将模块存储在库中,并且仍然将其链接到可执行文件中,则可以向可执行文件添加一个小模块,该模块引用您希望包含的每个模块中的一些符号。这需要在每次添加新模块时修改引用模块

如果您确实希望使用命令行执行此操作,并且您碰巧使用了选项与GNU
ld
兼容的链接器和选项与gcc/g++兼容的编译器,则可以按如下方式执行:

gcc -o MAIN MAIN.cc -Wl,-u,SYMBOL -lLIBRARY
文件:register.cc
库的全部要点是,只有在必要时才包括其中的模块。表明模块是必需的规范方法是使用模块中定义的某个名称进行ODR

如果您希望无条件地将模块链接到可执行文件中,那么(在大多数构建系统上)只需将编译模块的文件名添加到要链接到最终可执行文件的文件名列表中即可。这意味着每次添加新模块时都要修改构建说明

如果您希望将模块存储在库中,并且仍然将其链接到可执行文件中,则可以向可执行文件添加一个小模块,该模块引用您希望包含的每个模块中的一些符号。这需要在每次添加新模块时修改引用模块

如果您确实希望使用命令行执行此操作,并且您碰巧使用了选项与GNU
ld
兼容的链接器和选项与gcc/g++兼容的编译器,则可以按如下方式执行:

gcc -o MAIN MAIN.cc -Wl,-u,SYMBOL -lLIBRARY
文件:register.cc
您需要在头文件中声明这一点,并包括所述头文件。定义可以保留在源文件中。我不想在任何其他单元中引用关于它们的任何内容,我只想在代码之外引用这些代码,以实现类似“自动注册插件”的机制,除非您试图将其放在静态库中,否则您不需要从代码中引用源文件。(您仍然需要确保您的IDE确实编译并链接了该文件,但这应该像任何其他文件一样自动发生)是的,这些代码位于静态库中……您需要在头文件中声明并包含所述头文件。定义可以保留在源文件中。我不想在任何其他单元中引用关于它们的任何内容,我只想在代码之外引用这些代码,以实现类似“自动注册插件”的机制,除非您试图将其放在静态库中,否则您不需要从代码中引用源文件。(您仍然需要确保您的IDE确实编译并链接了文件,但这应该像其他任何文件一样自动发生)是的,这些代码位于静态库中…我可以显式链接一些对象文件吗?如果是,哪些标志可以在xcode/gcc中使用?我可以显式链接一些对象文件使用链接标志吗?如果是,在xcode/gcc中可以使用哪些标志?
#include <iostream>

int main(int argc, char** argv) {
  std::cout << "Starting " << argv[0] << '\n';
  return 0;
}
#include <iostream>
class Register {
  public:
    Register() {
      std::cout << "Registered\n";
    }
};

Register registry;
$ g++ -c -o regmain.o regmain.cc
$ g++ -c -o register.o register.cc
$ ar rcs libregister.a register.o
$ g++ -o regmain regmain.o -Wl,-u,registry -L. -lregister
$ ./regmain
Registered
Starting ./regmain