在我看来,这似乎是一个明智的选择,但我无法找到任何反对或为此的信息.
从demangling等的角度来看,我不认为这是一个大问题,但我无法弄清楚,我怎么能写一个小C程序从一个小小的C++库调用一个函数.
我现在在linux上,尝试使用静态绑定.
这肯定是许多人遇到的事情或许多书籍所涵盖的事情,但我觉得这是一个坐在这个问题面前的盲人.有趣的是,在SO上也没有这样的问题.
我甚至不知道如果这可以工作,那么必须如何做得更少.
我已经看到了C库链接到C++的人或者链接到C的C++库的许多问题和答案...但是我有一个链接到C++的C++库,并且与人们将C和C++混合在一起时会遇到相同的症状(链接期间未定义的引用).
这是我的g ++系列:
g++ -L C:/MyLibraries mycode.cpp -shared -o mycode.dll -lopengl32 -lglu32 -lgdi32 -lMyLibrary
Run Code Online (Sandbox Code Playgroud)
到目前为止,我遇到的每个答案都谈到了以下包装我的标题:
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
但是,我的库是纯C++,100%类,没有全局函数,没有外部"C"可以写入(不能在类中的方法上使用"C",并且用extern包装整个类集合) C"什么都不做......链接时仍然是未定义的引用".
MyLibrary.lib是在Visual Studio 2010中编写的.而且,我使用Visual Studio 2005和2008编写了许多库.没有一个人需要将extern"C"添加到其中任何一个以静态链接到其他基于Visual Studio的项目.C++库链接到其他C++项目,没有任何问题.
这是Visual Studio负责的东西吗?g ++没有?我可以将大量自己的C++自定义静态库静态链接到其他C++项目中,它只是起作用.Visual Studio是否足够聪明,可以破译它自己的C++方法名称,所以直到现在我还没有遇到过这种情况?但是g ++不知道该怎么做,强制要求C命名约定(即使我的所有目标都是100%C++)?
或者问题是即使我使用g ++,它仍然执行一些标准的C规则?我的g ++命令行出了什么问题?
即使在MSDN上寻找输出dll函数的答案,也会让我看起来更像是我的g ++系列出了问题,因为他们的链接有诸如"将C函数导出到C++可执行文件"和"将C++函数导出到C"等主题可执行文件",没有链接"将C++函数导出到C++可执行文件中"在任何地方提到...我在我的函数上尝试了__declspec(dllexport),这些函数已编译,但仍然未定义与g ++的链接.有任何想法吗?
谢谢.
如何调试Visual C ++ 2010 SP1应用程序无法完全加载其依赖项,并且过早退出而又不显示其UI的情况?
如果您认为与Fusion Logs,依赖项遍历和远程调试器相关,那么我会对它们的良好指南感兴趣。是否可以通过WinDbg轻松验证?流程浏览器呢?
是否可以在连接了远程调试器的远程计算机上启动进程?
是否可以验证是否安装了正确的Visual C ++ 2010 SP1运行时?
一个限制:安装了Visual Studio的应用程序在开发人员的盒子上运行良好。问题只能在干净的目标计算机上观察到。这意味着安装工具链时问题可能会消失。
虽然我不是C语言的经验丰富的程序员,但我必须在工作中使用这种语言来构建一个静态库,它可以在SunOS和Win32上编译.这个库只有几个源文件及其相应的头文件(让我们说:a.c,b.c,a.h和b.h).项目在两个平台中编译,并mylib.a生成库.
我的问题是如何将实现的函数暴露mylib.a给其他项目,因为当我添加两者时a.h,b.h我得到一些宏重定义错误.
编辑:我发现宏重新定义错误是因为编译命令中的宏定义(与我的标题无关)并且它已经解决了:)但我仍然希望组织我的源文件和头文件.
我怀疑的是我是否修改a.h并b.h在外部使用,或者我是否应该专门创建一个头文件来声明这个库的接口(让我们说mylib.h).我不想过度复杂化原始标题,但我不想让同一个标题保持同步...我想听听更有经验的C程序员关于他们的模式,每种方法的优点以及是否还有其他方法选项.
先感谢您.
编辑:似乎我没有提供足够的信息; 下面的模式试图显示我的文件是如何组织的:每个代码文件只包含其标题,每个标题都有一个保护条件,每个标题包含一个公共标题,这个公共标题包括所有标题.
// a.c ----
#include "a.h"
// b.c ----
#include "b.h"
// a.h ----
#ifndef GUARD_A_H
#define GUARD_A_H
# include "liball.h"
void function_prototypes_implemented_in_a();
#endif // GUARD_A_H
// b.h ----
#ifndef GUARD_B_H
#define GUARD_B_H
# include "liball.h"
void function_prototypes_implemented_in_b();
#endif // GUARD_B_H
// liball.h ----
#ifndef GUARD_LIBALL_H
#define GUARD_LIBALL_H
# include <time.h> // …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个使用Boost库的文件系统部分功能的项目,并且我不断收到链接器错误.
我按照Boost文档构建它并成功构建,然后将所有lib文件从stage目录移动到C:/ boost/lib,将hpp文件移动到C:/ boost/include.我正在使用Microsoft Visual Studio 2012 Express Edition.我已经确保将属性页面中的文件(libboost_filesystem-vc110-mt-1_54.lib和libboost_system-vc110-mt-1_54.lib)添加到需要链接的文件中(我也尝试过#pragma明确地说).我尝试了包含gd的.lib文件和那些不调试的文件(调试文件和不用于调试的文件).
我的问题是,我该如何解决这个问题?我构建错误的文件了吗?我是否指定了某种链接器属性错误?
这是错误(我省略了一些以保持简短,如果需要我可以将它们全部添加):
Error 1 error LNK2019: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" (?system_category@system@boost@@YAAEBVerror_category@12@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'native_ecat''(void)" (??__Enative_ecat@system@boost@@YAXXZ) C:\Visual Studio 2012 Projects\MMS_Solution\MMS_Prj_FindFile\MMS_Prj_FindFile.obj MMS_Prj_FindFile
Error 2 error LNK2019: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (?generic_category@system@boost@@YAAEBVerror_category@12@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'errno_ecat''(void)" (??__Eerrno_ecat@system@boost@@YAXXZ) C:\Visual Studio 2012 Projects\MMS_Solution\MMS_Prj_FindFile\MMS_Prj_FindFile.obj MMS_Prj_FindFile
[...]
Error 5 error LNK2019: unresolved external symbol "public: class boost::filesystem::path …Run Code Online (Sandbox Code Playgroud) 当我编译一个使用g ++使用STL的程序时,库如何链接到我的程序?动态还是静态?
对我来说静态听起来很奇怪,因为这意味着每个使用STL的C++程序都必须在内部包含它.另一方面,动态链接声音对我来说也很奇怪,因为所有的OOP内容我都没有看到库如何动态链接并且还支持不同类型的对象......
那究竟发生了什么?
我正在尝试编译和链接SDL2 + urho3d + QT.现在SDL和urho3d是静态的lib,它们工作得很好并且在一些例子中编译得很好但是当我尝试编译所有这些时,编译传递抛出罚款但我收到了很多链接器错误.
以下是我尝试编译的文件:SDL2 + QT + urho3d
以下是链接器错误:
1> Creating library debug\\UDK.lib and object debug\\UDK.exp
1>Urho3D_d.lib(Timer.obj) : error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function "public: unsigned int __thiscall Urho3D::Timer::GetMSec(bool)" (?GetMSec@Timer@Urho3D@@QAEI_N@Z)
1>Urho3D_d.lib(SDL_systimer.obj) : error LNK2001: unresolved external symbol __imp__timeGetTime@0
1>Urho3D_d.lib(Timer.obj) : error LNK2019: unresolved external symbol __imp__timeBeginPeriod@4 referenced in function "public: void __thiscall Urho3D::Time::SetTimerPeriod(unsigned int)" (?SetTimerPeriod@Time@Urho3D@@QAEXI@Z)
1>Urho3D_d.lib(SDL_systimer.obj) : error LNK2001: unresolved external symbol __imp__timeBeginPeriod@4
1>Urho3D_d.lib(Timer.obj) : error LNK2019: unresolved external symbol __imp__timeEndPeriod@4 referenced in function …Run Code Online (Sandbox Code Playgroud) 我正在制作一个非常简单的程序,使用c ++进行linux使用,我想知道是否可以制作一个包含所有依赖项的大二进制文件,这些依赖项可以在任何Linux系统上运行.
如果我的理解是正确的,那么任何编译器都会将源代码转换为机器指令,但由于通常存在可以与不同程序一起使用的公共代码部分,因此大多数程序依赖于其他库.
但是,如果我有所有依赖项的源代码,我应该能够以不需要系统的任何方式编译二进制文件?我能在32位系统上运行64位系统编译的东西吗?
我使用Visual Studio 2012,并尝试使静态库UDT正常工作。不幸的是,我无法编译将UDT库链接到其自身的项目,我在Windows SDK标头中遇到有关类型或宏重新定义的159个奇怪的错误。
c:\program files\windows kits\8.0\include\shared\ws2def.h(96): warning C4005: 'AF_IPX' : macro redefinition
2> c:\program files\windows kits\8.0\include\um\winsock.h(452) : see previous definition of 'AF_IPX'
2>c:\program files\windows kits\8.0\include\shared\ws2def.h(136): warning C4005: 'AF_MAX' : macro redefinition
2> c:\program files\windows kits\8.0\include\um\winsock.h(471) : see previous definition of 'AF_MAX'
2>c:\program files\windows kits\8.0\include\shared\ws2def.h(173): warning C4005: 'SO_DONTLINGER' : macro redefinition
2> c:\program files\windows kits\8.0\include\um\winsock.h(394) : see previous definition of 'SO_DONTLINGER'
2>c:\program files\windows kits\8.0\include\shared\ws2def.h(217): error C2011: 'sockaddr' : 'struct' type redefinition
2> c:\program files\windows kits\8.0\include\um\winsock.h(477) : see declaration …
我正在构建一个动态库libfoo.so,该库取决于libcrypto.so。
在我的自动工具Makefile.am文件中,我有这样一行:
libfoo_la_LIBADD += -L${OPENSSL_DIR}/lib -lcrypto
Run Code Online (Sandbox Code Playgroud)
其中$OPENSSL_DIR缺省为/usr,但可以通过使被覆盖--with-openssl-dir=/whatever。
我如何确保(仅)libfoo.so使用一个可执行文件而无需构建或运行该可执行文件的人来使用或摆弄?${OPENSSL_DIR}/lib/libcrypto.sorpathLD_LIBRARY_PATH
就目前情况而言,我可以构建libfoo并通过--with-openssl-dir=/usr/local/openssl-special,并且构建良好。但是,当我运行ldd libfoo.so,它只是指向libcrypto.so在/usr/lib。
我能想到的唯一解决方案是静态链接libcrypto.a到libfoo.so。还有其他可能的方法吗?