草庐IT

c++ - Windows & C++ : extern & __declspec(dllimport)

“extern”和“__declspec(dllimport”)之间有什么区别/关系?我发现有时需要同时使用它们,有时一个就足够了。我说的对吗:“extern”用于静态链接库,"__declspec(dllimport)"用于DLL(动态链接库),对于各自的链接类型,两者实际上都做了相同的工作,在使用导入库(有助于与dll链接的小.lib文件)时,您需要同时使用这两者吗? 最佳答案 extern表示实体具有外部链接,即在其翻译单元(C或CPP文件)之外可见。这意味着相应的符号将被放置在目标文件中,因此如果该目标文件成为静态库的一部分

C++ 链接问题,好像我不能链接到标准 C++ 东西

我正在尝试使用我自己在iOS应用中编译的库。该库是TesseractOCR库。似乎编译它(及其依赖项)已经好了。但是,当我尝试在我的应用项目中链接此库时,应用无法链接。链接错误让我感到惊讶;似乎Tesseract的东西在寻找非常标准的C++东西方面存在问题。任何关于我可能做错的建议都会非常有帮助。这是我看到的链接错误的片段。Undefinedsymbolsforarchitecturearmv7:"std::string::find_last_of(charconst*,unsignedlong)const",referencedfrom:tesseract::WordSizeMode

C++ 链接问题,好像我不能链接到标准 C++ 东西

我正在尝试使用我自己在iOS应用中编译的库。该库是TesseractOCR库。似乎编译它(及其依赖项)已经好了。但是,当我尝试在我的应用项目中链接此库时,应用无法链接。链接错误让我感到惊讶;似乎Tesseract的东西在寻找非常标准的C++东西方面存在问题。任何关于我可能做错的建议都会非常有帮助。这是我看到的链接错误的片段。Undefinedsymbolsforarchitecturearmv7:"std::string::find_last_of(charconst*,unsignedlong)const",referencedfrom:tesseract::WordSizeMode

c++ - 使用 CMake 打开链接器标志

使用CMake生成VS2010目标时,我希望打开/LTCG标志(如果可能,仅适用于release+releasewithdebinfo,但如果它打开用于调试构建也可以)。如何修改链接器标志?add_definitions()不起作用,因为那只会修改编译器标志。是的,我已经将它包装在if(MSVC)中。如何修改链接器标志? 最佳答案 您可以使用#pragmacomment(linker,...)修改MSC中的链接器标志但是,如果您想在构建过程中使用cmake进行此操作,则需要知道以下名称:CMAKE_EXE_LINKER_FLAGSC

c++ - 使用 CMake 打开链接器标志

使用CMake生成VS2010目标时,我希望打开/LTCG标志(如果可能,仅适用于release+releasewithdebinfo,但如果它打开用于调试构建也可以)。如何修改链接器标志?add_definitions()不起作用,因为那只会修改编译器标志。是的,我已经将它包装在if(MSVC)中。如何修改链接器标志? 最佳答案 您可以使用#pragmacomment(linker,...)修改MSC中的链接器标志但是,如果您想在构建过程中使用cmake进行此操作,则需要知道以下名称:CMAKE_EXE_LINKER_FLAGSC

c++ - 链接到可执行文件时如何强制将目标文件包含在静态库中?

我有一个C++项目,由于其目录结构被设置为静态库A,它被链接到共享库B,它被链接到可执行文件C。(这是一个使用CMake的跨平台项目,所以在Windows上我们得到A.lib、B.dll和C.exe,在Linux上,我们得到libA.a、libB.so和C。)库A有一个init函数(A_init,在A/initA.cpp中定义),从库B的init函数(B_init,定义在B/initB.cpp),从C的main中调用。因此,当链接B时,A_init(以及在initA.cpp中定义的所有符号)被链接到B(这是我们想要的行为)。问题在于A库还定义了一个预期的函数(Af,在A/Afort.f

c++ - 链接到可执行文件时如何强制将目标文件包含在静态库中?

我有一个C++项目,由于其目录结构被设置为静态库A,它被链接到共享库B,它被链接到可执行文件C。(这是一个使用CMake的跨平台项目,所以在Windows上我们得到A.lib、B.dll和C.exe,在Linux上,我们得到libA.a、libB.so和C。)库A有一个init函数(A_init,在A/initA.cpp中定义),从库B的init函数(B_init,定义在B/initB.cpp),从C的main中调用。因此,当链接B时,A_init(以及在initA.cpp中定义的所有符号)被链接到B(这是我们想要的行为)。问题在于A库还定义了一个预期的函数(Af,在A/Afort.f

c++ - 功能级链接(VC++ 中的/Gy 开关)- 它有什么用?

在大型VS解决方案(200个VC项目)中使用此开关有什么好处?据我了解,这主要影响生成的二进制文件的大小;但除了较小的二进制文件之外,FLL是否也有助于减少项目之间的依赖关系?FLL通常如何影响构建时间?我还希望能对VC中的FLL进行有根据的解释。MSDN的解释很简短。 最佳答案 由于您链接了MSDN的解释,您知道/Gy确保所有函数都打包在它们自己的COMDAT中。这样做的主要优点是,如果您有相同的功能,链接器可以将它们全部折叠成一段实际的代码(“COMDAT折叠”)。当您有许多相同的功能时,这可能会产生非常大的影响,当您编写大量使

c++ - 功能级链接(VC++ 中的/Gy 开关)- 它有什么用?

在大型VS解决方案(200个VC项目)中使用此开关有什么好处?据我了解,这主要影响生成的二进制文件的大小;但除了较小的二进制文件之外,FLL是否也有助于减少项目之间的依赖关系?FLL通常如何影响构建时间?我还希望能对VC中的FLL进行有根据的解释。MSDN的解释很简短。 最佳答案 由于您链接了MSDN的解释,您知道/Gy确保所有函数都打包在它们自己的COMDAT中。这样做的主要优点是,如果您有相同的功能,链接器可以将它们全部折叠成一段实际的代码(“COMDAT折叠”)。当您有许多相同的功能时,这可能会产生非常大的影响,当您编写大量使

c++ - 什么时候应该在非成员函数之前写关键字 'static'?

我最近在SO上看到了一些关于函数前的static关键字的信息,我想知道如何正确使用它。1)什么时候应该在非成员函数前写关键字static?2)在header中定义静态非成员函数是否危险?为什么(不)?(附带问题)3)是否可以以某种方式在头文件中定义一个类,以便它只在您首先使用它的翻译单元中可用?(我问这个的原因是因为我正在学习STL,它可能是我的谓词等(可能是仿函数)的一个很好的解决方案,因为我不喜欢定义成员以外的函数-cpp文件中的函数)(另外,我认为它在某种程度上与原始问题相关,因为根据我目前的推理,它会在函数之前做与static相同的事情)编辑看到一些答案时提出的另一个问题:4)