[[UPDATE]] - >如果我在program.cpp中#include"Queue.cpp",它就可以了.这不应该是必要的,对吗?
嘿所有 - 我正在使用Visual Studio 2010并且无法链接快速和脏的Queue实现.我从一个空的 Win32控制台应用程序开始,所有文件都存在于项目中.对于详细程度,这里是复制我的错误的完整代码.我意识到一些代码实际上可能是错误的.我还没有机会测试它,因为我还没有能够链接它.
Queue.hpp
#ifndef ERROR_CODE
#define ERROR_CODE
enum Error_Code
{
Success,
Underflow,
Overflow
};
#endif // ERROR_CODE
#ifndef QUEUE
#define QUEUE
template<class T>
struct Queue_Node
{
T data;
Queue_Node *next;
Queue_Node()
{
next = NULL;
}
Queue_Node(T pData)
{
data = pData;
next = NULL;
}
Queue_Node(T pData, Queue_Node *pNext)
{
data = pData;
next = pNext;
}
};
template<class T>
class Queue
{
public:
Queue();
Error_Code Serve();
Error_Code Append(T item);
T …Run Code Online (Sandbox Code Playgroud) 我有以下文件.
foo.h(C++头文件)
foo.mm(C++文件)
test_viewcontroller.h(目标c头文件)
test_viewcontroller.m(目标c文件)
我已经在foo.h中声明了一个方法donothing()并在foo.mm中定义它.让我们说它是
双重承诺(双倍){返回; }
现在,我尝试在test_viewcontroller.m中调用此函数
double var = donothing(somevar);
我在test_viewcontroller.o中获得链接器错误,其中显示"找不到符号"_donothing().
collect2:ld返回1退出状态
任何人都可以指出我有什么问题吗?
让我准确一点:
#ifdef __cplusplus
extern "C"
{
char UTMLetterDesignator(double Lat);
NSString * LLtoUTM(double Lat,double Long,double UTMNorthing, double UTMEasting);
double test(double a);
}
#endif
Run Code Online (Sandbox Code Playgroud)
@Carl
我已经包含了我的代码示例.我说我需要在ifdef中只包装test()方法.我不明白它可以有什么区别.你能解释一下吗?
我收到错误:
main.o(.text+0x1ed): In function `main':
: undefined reference to `avergecolumns'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
当我gcc*.o.我不太清楚导致这个错误的原因.其他海报已经解释了它没有找到功能或功能是空的.如果有人可以澄清或改进,那将非常感谢!
这是我的函数代码(我试图计算2D数组中列的平均值):
#include "my.h"
void averagecolumns (int x, int y, int** a)
{
int i;
int j;
float sum;
float colAvg;
sum = 0;
colAvg = 0;
printf("i. The column averages are: \n");
for(i = 0; i < x; i++)
{
for(j = 0; j < y; j++)
{
sum += a[i][j];
colAvg = sum / (float)x;
}
printf("Column: %3d, Average: %6.2f", j, colAvg); …Run Code Online (Sandbox Code Playgroud) 错误LNK2001:未解析的外部符号"private:static class irrklang :: ISoundEngine*GameEngine :: Sound :: _ soundDevice"(?_soundDevice @ Sound @ GameEngine @@ 0PAVISoundEngine @ irrklang @@ A)
我无法弄清楚为什么我收到这个错误.我相信我正在初始化.任何人都可以伸出援手吗?
sound.h
class Sound
{
private:
static irrklang::ISoundEngine* _soundDevice;
public:
Sound();
~Sound();
//getter and setter for _soundDevice
irrklang::ISoundEngine* getSoundDevice() { return _soundDevice; }
// void setSoundDevice(irrklang::ISoundEngine* value) { _soundDevice = value; }
static bool initialise();
static void shutdown();
Run Code Online (Sandbox Code Playgroud)
sound.cpp
namespace GameEngine
{
Sound::Sound() { }
Sound::~Sound() { }
bool Sound::initialise()
{
//initialise the sound engine
_soundDevice = irrklang::createIrrKlangDevice();
if (!_soundDevice) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Ubuntu中创建一个文件,当我让我不断收到此错误:
/usr/bin/ld: ../../gtest-1.7.0/libgtest.a(gtest-all.cc.o): undefined reference to symbol 'pthread_key_delete@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [src/tests/run_tests] Error 1
make[1]: *** [src/tests/CMakeFiles/run_tests.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
我看到有人提到要进入Makefile并将'-L/lib64 -l pthread'添加到变量LDFLAGS但是你怎么做?这里完全是Linux的新手= X.
所以我在2个单独的翻译单元中有这个代码:
// a.cpp
#include <stdio.h>
inline int func() { return 5; }
int proxy();
int main() { printf("%d", func() + proxy()); }
// b.cpp
inline int func() { return 6; }
int proxy() { return func(); }
Run Code Online (Sandbox Code Playgroud)
正常编译时,结果是10.当使用-O3(内联)编译时,我得到了11.
我已经明确做了ODR违规func().
当我开始将不同dll的来源合并为更少的dll时,它就出现了.
我试过了:
-Wodr(需要-flto)-detect-odr-violationsASAN_OPTIONS=detect_odr_violation=1在使用地址清理程序运行检测二进制文件之前进行设置.据称,Asan可以捕获其他ODR违规行为(具有不同类型或类似内容的全球变量......)
这是一个非常令人讨厌的C++问题,我很惊讶没有可靠的工具来检测它.
也许我误用了我试过的一种工具?或者是否有不同的工具?
编辑:
即使我使两个实现完全func()不同,这个问题仍然没有引起注意,因此它们不会被编译为相同数量的指令.
这也会影响类体内定义的类方法 - 它们是隐式内联的.
// a.cpp
struct A { int data; A() : data(5){} …Run Code Online (Sandbox Code Playgroud) 使用Xcode 4重新编译C++ iPhone应用程序我得到了这个讨厌的链接器错误:
ld: bad codegen, pointer diff in __static_initialization_and_destruction_0(int, int)
to global weak symbol vmml::Vector2<float>::ZERO for architecture armv6
Run Code Online (Sandbox Code Playgroud)
谁知道这意味着什么?如何让它消失当然也会很好:)
该应用程序在Xcode 3中无错误地编译和链接.
编辑:解决的办法是设置隐藏的默认符号来是在项目中的所有目标的所有生成设置.仍然没有更明智的实际问题是什么.
我有一个名为"SimpleFunctions.h"的文件定义如下:
#ifndef SIMPLEFUNCTIONS_H
#define SIMPLEFUNCTIONS_H
namespace my_namespace {
double round(double r) { return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); }
float round(float r) { return round((double)r); }
}
#endif // SIMPLEFUNCTIONS_H
Run Code Online (Sandbox Code Playgroud)
此文件以前只包含在一个文件中,并且工作正常.
今天我把它包含在第二个文件中,它不再有效.在链接时,它告诉我该函数已在"firstfile.obj"中定义.
但是,由于我使用包含警卫,我希望这些函数只定义一次,或者我错过了什么?
我最近从2005年升级到2012年(我很确定)并在构建我的解决方案时遇到链接错误.经过几个小时的谷歌搜索和周围的搜索,我的想法用尽了.我已经建立了几十个项目,所以我很确定我已经做好了一切,但公平地说,已经有几年了.
所以,作为测试我设置了一个新项目.我称之为App,一个Windows应用程序(.exe).我创建了第二个名为Core的项目,并在其配置类型中将其标记为静态库(.lib).两者都是解决方案的一部分.在Core中,我添加了Test.cpp和Test.h,它们包含一个具有简单功能的小类.然后,在Window的应用程序WinMain.cpp文件中,我有WinMain(),我通过CTest测试调用这个测试类; 测试结果();
与此同时,我将项目App的项目依赖项设置为Core,最后将其添加到App的附加包含目录中,以及Test.cpp/.h所在的核心代码的路径.
我得到以下链接错误,并不能为我的生活找出原因.有谁知道我可能错过了什么步骤或2012年从以前的版本中发生了什么变化?非常感谢您的帮助!
1>------ Build started: Project: App, Configuration: Debug Win32 ------
1>WinMain.obj : error LNK2019: unresolved external symbol "public: __thiscall CTest::CTest(void)" (??0CTest@@QAE@XZ) referenced in function _WinMain@16
1>WinMain.obj : error LNK2019: unresolved external symbol "public: __thiscall CTest::~CTest(void)" (??1CTest@@QAE@XZ) referenced in function _WinMain@16
1>WinMain.obj : error LNK2019: unresolved external symbol "public: int __thiscall CTest::Result(void)" (?Result@CTest@@QAEHXZ) referenced in function _WinMain@16
1>D:\Work\Test_Linker_Stupidity\App\Debug\App.exe : fatal error LNK1120: 3 unresolved externals
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ========
Run Code Online (Sandbox Code Playgroud) dependencies linker-errors static-libraries lnk2019 visual-studio-2012
我有两个可执行文件,它们都是交叉编译的,可以在Android中运行.我已将两者放在同一目录中的设备上.我已将它们所依赖的所有共享库放在同一目录中,包括ld-linux.so.3.我使用以下命令运行可执行文件:
ld-linux.so.3 --library-path/path/to/libraries executable_name
当作为任何用户运行时,它们都适用于旧版本的Android.如果以root身份运行,两者都可以在最新版本的Android上运行.当以任何用户身份运行时,只有一个可以在最新版本的android上运行.相反,它给出:
无法从共享对象映射段:不允许执行executable_name操作
如何找出不能运行的可执行文件的不同之处?
我在网上看了很多,大多数人都会收到这个错误:
A)没有它们所依赖的库之一或可执行文件本身的执行权限.
要么
B)尝试从作为NOEXEC挂载的目录运行.
这两种情况似乎并非如此.它可以找到所有库,我可以自己加载任何库,看看它依赖于解决的其他东西.此外,我可以从感兴趣的目录运行基本脚本.
较新版本的Android,Jelly Bean,是一个不同的Linux内核版本,我想知道这是否相关.
什么给?我该如何调试?
linker-errors ×10
c++ ×4
linker ×4
android ×1
c ×1
dependencies ×1
executable ×1
g++ ×1
include ×1
ios ×1
iphone ×1
linux ×1
lnk2019 ×1
objective-c ×1
queue ×1
templates ×1
visual-c++ ×1
xcode ×1
xcode4 ×1