我正在尝试编译在MS VS 2010中使用Visual C++ 2005和MFC编写的C++程序.遗憾的是,我在编译期间遇到以下错误:
Error 2 error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) already defined in CMemDCImpl.obj Project\Project\Project\uafxcwd.lib(afxglobals.obj) Project.
Run Code Online (Sandbox Code Playgroud)
CMemDCImpl有一个头文件,其中包含类CMemDCImpl的所有成员的定义,以及包含其实现的*.cpp文件.请帮我修复此错误.
我对iOS开发比较陌生,我正在尝试实现CocoaLumberjack日志记录.
我从https://github.com/robbiehanson/CocoaLumberjack下载了最新的源代码,在我的项目中包含了所需的文件,进行了必要的代码更改,并且得到了下面的运行时链接器错误.
环境是Xcode 4.2 Build 4C199,项目Target设置为Device = iPad,DeploymentTarget = 4.3.该项目最初编写使用保留/释放,所以我离开了原来的来源,不被加入编译器标志"-fobjc弧"为我使用的伐木工人文件:DDFileLogger.m,DDLog.m和DDTTYLogger.m .
控制台输出是:
GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Fri Sep 16 06:56:50 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was …Run Code Online (Sandbox Code Playgroud) 我正在研究MacOSX 10.7.2和Xcode 4.2.1.我libpng使用端口安装,我试图在我的应用程序中加载PNG图像,但我得到链接器错误:
Undefined symbols for architecture x86_64:
"_png_create_read_struct", referenced from:
loadPngImage(char*, int&, int&, bool&, unsigned char**) in test.o
"_png_create_info_struct", referenced from:
loadPngImage(char*, int&, int&, bool&, unsigned char**) in test.o
"_png_destroy_read_struct", referenced from:
loadPngImage(char*, int&, int&, bool&, unsigned char**) in test.o
"_png_set_longjmp_fn", referenced from:
loadPngImage(char*, int&, int&, bool&, unsigned char**) in test.o
"_png_init_io", referenced from:
loadPngImage(char*, int&, int&, bool&, unsigned char**) in test.o
"_png_set_sig_bytes", referenced from:
loadPngImage(char*, int&, int&, bool&, unsigned char**) in test.o
"_png_read_png", referenced from:
loadPngImage(char*, …Run Code Online (Sandbox Code Playgroud) 我在cmake下遇到链接错误,在使用旧版本的gcc编译系统时我没有这个错误.
特定错误是"未定义引用clock_gettime",但-lrt出现在命令行中.
我的gcc版本:
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)
cmake版本2.8.5
我在我的CMakeLists.txt文件中通过target_link_libraries包含了所需的"-lrt".我可以看到它出现在make VERBOSE = 1的编译器行中
我已经读过gcc 4.6在命令行上对链接库的位置很挑剔.
我怎样才能为CMake解决这个问题?
编辑:链接线
Linking CXX executable ../bin/obbsd
cd /home/matt/Desktop/Matt/OBBS/Build/server && /usr/bin/cmake -E cmake_link_script \
CMakeFiles/obbsd.dir/link.txt --verbose=1
/usr/bin/c++ -g CMakeFiles/obbsd.dir/Block.cpp.o \
CMakeFiles/obbsd.dir/BlockFileCache.cpp.o \
CMakeFiles/obbsd.dir/BlockFileStore.cpp.o \
CMakeFiles/obbsd.dir/BlockMemoryCache.cpp.o \
CMakeFiles/obbsd.dir/BlockStore.cpp.o CMakeFiles/obbsd.dir/Config.cpp.o \
CMakeFiles/obbsd.dir/DeleteBlockSession.cpp.o \
CMakeFiles/obbsd.dir/mConfigFile.cpp.o …Run Code Online (Sandbox Code Playgroud) One Definition Rule规定程序应包含每个非内联函数的一个定义.对于模板类的成员,这对我来说并不完全清楚:
///////////
// Tfoo.h
template<typename T> class A {
void foo(){}
};
///////////
// intfoo.h
#include <Tfoo.h>
template<> class Foo<int> {
void foo(); // declaration only
};
/*inline*/ void Foo<int>::foo(){} // definition
///////////
// X.cpp
#include <intfoo.h>
///////////
// Y.cpp
#include <intfoo.h>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,clientX.obj和clientY.obj都有一个定义Foo<int>::foo.链接器抱怨此符号定义不止一次:
Y.obj : error LNK2005: "private: void __thiscall Foo<int>::foo(void)"
(?foo@?$Foo@H@@AAEXXZ) already defined in X.obj
Run Code Online (Sandbox Code Playgroud)
当我在前面inline定义时Foo<int>::foo(),一切顺利,链接器很高兴.当我在单独的编译单元中定义它们时(例如intfoo.cpp).
(注意:此解决方案在/sf/answers/103725751/中提出)
可能是一种误解,但模板类的成员函数总是"内联"?这里的规则是什么?
c++ templates linker-errors one-definition-rule explicit-specialization
我已将libpng添加到我的应用程序中.如果我为模拟器构建,一切都很好.当我为设备构建应用程序时,我收到链接器错误:
Undefined symbols for architecture armv7: "_png_init_filter_functions_neon", referenced from: _png_read_filter_row in libpng-arm7-release.a(pngrutil.o)
Run Code Online (Sandbox Code Playgroud)
我已经从源手动构建了libpng,对于模拟器和设备也是如此(只有更改了编译目标).我试图找到这个问题,但似乎没有人发布有关此问题的任何内容.
我建立了一些的Visual C++ DLL和EXE项目与Visual Studio 2012年当默认的平台工具集建筑V110构建成功,但与Windows XP兼容的平台工具集构建时v110_xp失败,并在每个项目下面的链接器错误:
链接:致命错误LNK1104:无法打开文件',5.01'
需要注意的是,如果我改变从平台的Win32到x64时错误更改为:
链接:致命错误LNK1104:无法打开文件',5.02'
通过在Visual Studio中的"空项目"模板中创建一个新的EXE项目并添加一些*.cpp文件定义,可以轻松地重现这一点int main() {return 6;}.它将成功构建,直到您将平台工具集从v110更改为v110_xp.
为什么会发生这种情况?如何在Windows XP兼容性下成功构建这些项目?
在将Embarcadero C++ Builder更新到新版本后,我们的项目突然无法构建.这只发生在我们的一个项目中.对于大多数团队成员而言,相同的代码构建没有错误.在我的计算机上,每次都会失败.
在构建选项卡中:
[ilink32] Fatal: Out of memory
Run Code Online (Sandbox Code Playgroud)
在输出选项卡中:
Build FAILED.
c:\program files (x86)\embarcadero\studio\18.0\Bin\CodeGear.Cpp.Targets(3517,5): error : Fatal: Out of memory
Run Code Online (Sandbox Code Playgroud)
没有更多信息.
如果我启用动态RTL链接,项目链接没有错误.例如,如果我们的Debug目标启用了该设置,则项目将在Debug中链接,但不在Release中.
我该如何解决这个问题?如何为链接器提供更多内存?
我在Visual Studio中创建的asm项目调用C函数时遇到问题(Win10 x64,Visual Studio 2015).项目由一个asm文件组成:
.586
.model flat, stdcall
option casemap:none
includelib msvcrt.lib
ExitProcess PROTO return:DWORD
extern printf:near
.data
text BYTE "Text", 0
.code
main PROC
push offset text
call printf
add esp,4
invoke ExitProcess,0
main ENDP
end main
Run Code Online (Sandbox Code Playgroud)
当我构建项目时,链接器输出错误:
错误LNK2019未解析的函数_main @ 0中引用的外部符号_printf
链接器输出参数:
/OUT:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.exe"/ MANIFEST:NO/NXCOMPAT /PDB:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.pdb"/ DYNAMICBASE "kernel32.lib""user32.lib""gdi32.lib""winspool.lib""comdlg32.lib""advapi32.lib""shell32.lib""ole32.lib""oleaut32.lib""uuid.lib" "odbc32.lib""odbccp32.lib"/ MACHINE:X86/SAFESEH:NO/INCREMENTAL:NO /PGD:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.pgd"/ SUBSYSTEM:WINDOWS/MANIFESTUAC: "level ='asInvoker'uiAccess ='false'"/ ManifestFile:"Debug\SP_Lab7_Demo.exe.intermediate.manifest"/ ERRORREPORT:PROMPT/NOLOGO/TLBID:1
如果我发表评论call print,那么一切都正常执行(甚至是Windows API函数).有没有办法从asm文件调用C函数而不创建包含的cpp文件<cstdio>?有可能吗?
在一个静态库项目中,我有一个带声明但未实现的函数的头文件.
我有一个实现这些功能的.cpp文件.
然后,为了更好地理解链接器错误,我复制了cpp文件,所以我有一个完全重复的它也被编译.因此,两个文件都有标头中每个符号的双重实现.
它编译,当在另一个项目中使用时,它会链接.
这是静态库的最小示例:
api.hpp:
void printWhatever();
Run Code Online (Sandbox Code Playgroud)
errortest.cpp和duplicate.cpp是相同的:
#include "api.hpp"
#include <iostream>
void printWhatever(){
std::cout << "hi " << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我将其编译为包含这两个源文件的静态库.我看到编译器为两个文件生成报告.
现在我在一个可执行文件中使用这个编译库,一个不同的项目:main.cpp:
#include <api.hpp>
int main(int argc, const char * argv[]) {
printWhatever();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它运行并打印"hi".
为什么函数没有多重定义?
linker-errors ×10
c++ ×4
libpng ×2
assembly ×1
c++builder ×1
cmake ×1
gcc ×1
ios ×1
linker ×1
lnk2005 ×1
logging ×1
lumberjack ×1
macos ×1
masm ×1
objective-c ×1
templates ×1
visual-c++ ×1
x86 ×1
xcode ×1