标签: undefined-reference

C回调函数模板:显式实例化模板

前提

我正在使用C库(来自C++),它提供以下接口:

void register_callback(void* f, void* data);
void invoke_callback();
Run Code Online (Sandbox Code Playgroud)

问题

现在,我需要注册一个函数模板作为回调,这导致我的问题.请考虑以下代码:

template <typename T> void my_callback(void* data) { … }

int main() {
    int ft = 42;
    register_callback(reinterpret_cast<void*>(&my_callback<int>), &ft);
    invoke_callback();
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下链接器错误(在OS X上使用g ++(GCC)4.5.1,但适用于编译器版本/平台的大多数其他组合):

架构x86_64的未定义符号:

"void my_callback<int>(void*)", referenced from:  
  _main in ccYLXc5w.o
Run Code Online (Sandbox Code Playgroud)

我觉得这是可以理解的.

首个"解决方案"

通过显式实例化模板可以轻松解决此问题:

template void my_callback<int>(void* data);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不适用于我的真实代码,因为回调是函数模板中注册的,我不知道这个函数将被调用哪个模板参数集,因此我不能为所有的函数提供显式实例化.他们(我正在编写一个图书馆).所以我的真实代码看起来有点像这样:

template <typename T>
void do_register_callback(T& value) {
    register_callback(reinterpret_cast<void*>(my_callback<T>), &value);
    // Other things …
}

int main() {
    int ft = 42;
    do_register_callback(ft);
    invoke_callback();
}
Run Code Online (Sandbox Code Playgroud)

第二"解决方案"

通过调用函数隐式实例化函数模板.所以我们这样做,但要确保调用没有实际执行(该函数有副作用): …

c++ macos templates undefined-reference gcc4

14
推荐指数
3
解决办法
2705
查看次数

g ++编译错误:对存在的共享库函数的未定义引用

我最近在ubuntu机器上安装了hdf5库,现在无法链接到导出的函数.我写了一个简单的测试脚本readHDF.cpp来解释这个问题:

#include <hdf5.h>

int main(int argc, char * argv[])
{
  hid_t     h5_file_id = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译命令是

g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include \
    -L$HOME/hdf5/lib -l:$HOME/hdf5/lib/libhdf5.so readHDF.cpp
Run Code Online (Sandbox Code Playgroud)

返回以下错误

/tmp/cc6DXdxV.o: In function `main':  
readHDF.cpp:(.text+0x1f): undefined reference to `H5check_version'  
readHDF.cpp:(.text+0x3c): undefined reference to `H5Fopen'  
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为nm命令似乎说该函数已被导出:

nm -C $HOME/hdf5/lib/libhdf5.so | grep H5check_version
Run Code Online (Sandbox Code Playgroud)

返回

0000000000034349 T H5check_version
Run Code Online (Sandbox Code Playgroud)

和类似的结果H5Fopen.什么可能出错?不确定它是否有帮助,但如果我注释掉H5Fopen脚本的部分,那么它编译得很好:

#include <hdf5.h>

int main(int argc, char * argv[])
{
hid_t …
Run Code Online (Sandbox Code Playgroud)

g++ shared-libraries hdf5 ld undefined-reference

14
推荐指数
2
解决办法
2万
查看次数

未定义引用符号'pthread_key_delete @@ GLIBC_2.2.5

我正在尝试在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.

linux linker-errors undefined-reference

14
推荐指数
2
解决办法
2万
查看次数

对SSL_library_init和SSL_load_error_strings的未定义引用

我正在实现一个OpenSSL代码并且已经包含了必需的头文件,但我仍然遇到像*这样的错误

未定义的引用 SSL_library_init

我想这是一个链接错误而不是编译错误.

我正在使用slickeditor在Linux机箱中实现它.

c openssl undefined-reference

13
推荐指数
3
解决办法
4万
查看次数

链接boost库时出现另一个"未定义的引用"错误

我已经看过几个其他帖子来处理这个完全相同的问题.但是,他们的解决方案似乎都不适合我.我编译如下代码: __CODE____CODE__是这样的:

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/timer/timer.hpp>

using namespace boost::numeric::ublas;

int main(){    
   matrix<double> mat1 (3,3);
   matrix<double> mat2 (3,3);
   matrix<double> mat3 (3,3);

   unsigned k=0;

   for(unsigned i = 0; i < mat1.size1(); ++i){
      for(unsigned j = 0; j < mat1.size2(); ++j){
         mat1(i,j) = k;
         mat2(i,j) = 2*k++;
      }   
   }   

   k=0;
   if(1){
      boost::timer::auto_cpu_timer t;
      while(k<1000){
         mat3 = prod(mat1,mat2);
         k++;
      }   
   }   
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,__CODE__在仅调用相应__CODE__委托方法的类别中声明.

问题是这根本没有动画并且显示发射器处于其最终位置.我的印象是,一旦将动画添加到图层,您应该将其背后的实际模型更改为其最终位置,以便在动画完成时模型处于最终状态; 即,防止动画"回弹"到其原始位置.

我已经尝试将最后两行放在__CODE__块中,这确实按预期动画.但是,当动画结束时,一些粒子会在发射器的原始位置间歇性地发射.如果您将系统置于负载状态(例如,在播放动画时滚动表格视图),则会更频繁地发生这种情况.

我想到的另一个解决方案是不要移动它,__CODE__只是移动__CODE__自己,虽然我还没有尝试过. …

c++ boost undefined-reference

13
推荐指数
2
解决办法
1万
查看次数

使用GCC交叉编译器时对printf的未定义引用

我正在尝试使用交叉编译器(GCC 4.9.2)进行以下简单的"Hello World"程序编译mips:

#include <stdio.h>

int main()
{
  int x = 5;
  printf("x = %d\n", x);
}
Run Code Online (Sandbox Code Playgroud)

x变量用于阻止GCC更改printfputs,它似乎自动为一个简单的换行终止字符串.

我已经构建了一个交叉编译器${HOME}/xc并使用以下命令执行它:

${HOME}/xc/bin/mips-gcc -v hello.c
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

/tmp/ccW5mHJu.o: In function `main':
(.text+0x24): undefined reference to `printf'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我假设这是链接器的一个问题,因为我希望该进程先前失败,例如stdio.h在搜索路径上找不到.我可以编译一个简单的程序,只返回零,所以不是整个工具链被破坏的情况,大概只是标准的库链接(我使用的是newlib 2.2.0-1).

无论我是在Linux(Ubuntu 14.10)还是Cygwin(Windows 8)下运行交叉编译器,我都会得到同样的错误.

海湾合作委员会的全部产出是:

Using built-in specs.
COLLECT_GCC=/home/paul/xc/bin/mips-gcc
COLLECT_LTO_WRAPPER=/home/paul/xc/libexec/gcc/mips/4.9.2/lto-wrapper
Target: mips
Configured with: /home/paul/xc/mips/tmp/gcc-4.9.2/configure --prefix=/home/paul/xc --target=mips --enable-languages=c --with-newlib --without-isl --without-cloogs --disable-threads --disable-libssp --disable-libgomp --disable-libmudflap
Thread model: single …
Run Code Online (Sandbox Code Playgroud)

c gcc mips cross-compiling undefined-reference

13
推荐指数
1
解决办法
3万
查看次数

在c程序中获取错误"对gettid的未定义引用"

这是我的线程子例程...... 在这里,我创建了4个线程并将结构作为参数传递给线程子例程.

我试图用getid()函数打印线程ID ,

我收到错误说"未定义引用gettid()".

我添加了必要的头文件......

#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#define ARRAYSIZE 17
#define NUMTHREADS 4

struct ThreadData {
        int start, stop;
        int* array; 
};

void* squarer(void* td) 
{
     struct ThreadData* data=(struct ThreadData*) td;

     int start=data->start;
     int stop=data->stop;
     int* array=data->array;
     int i;
     pid_t tid1;

     tid1 = gettid(); //error at this statement//`
     printf("tid : %d\n",tid1);

     for (i=start; i<stop; i++) {
         sleep(1);
         array[i]=i*i;
         printf("arr[%d] = [%d]\n",i,array[i]);
     } 
   return NULL;
}

int main(void) {
    int array[ARRAYSIZE];
    pthread_t thread[NUMTHREADS]; …
Run Code Online (Sandbox Code Playgroud)

c undefined-reference

12
推荐指数
2
解决办法
2万
查看次数

未定义的引用 - 尽管链接器找到了lib

我有一个简单的程序来测试python开发文件的可用性:

#include<Python.h>
int main(){Py_Initialize(); Py_Finalize(); }
Run Code Online (Sandbox Code Playgroud)

我编译它(安装了python 2.7)as gcc -I/usr/include/python2.7 -lpython2.7 p.c.它在其他机器上工作正常,除了在Ubuntu 12.04(精确)的大多数干净的chroot我不断得到

/tmp/ccj8Mgjb.o: In function `main':
p.c:(.text+0x5): undefined reference to `Py_Initialize'
p.c:(.text+0xa): undefined reference to `Py_Finalize'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

已安装标头,/usr/lib/libpython2.7.so但链接器仍然失败.该符号列在.so文件中,gcc正在读取右侧libpython2.7.so:

$ nm -D libpython2.7.so.1.0  | grep Py_Initialize
00000000000c9c20 T Py_Initialize
00000000000c9260 T Py_InitializeEx

$ strace -f gcc -I/usr/include/python2.7 -lpython2.7 /tmp/p.c 2>&1 |grep   libpython2.7 |grep open
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libpython2.7.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] …
Run Code Online (Sandbox Code Playgroud)

linker undefined-reference

11
推荐指数
2
解决办法
1万
查看次数

Pcap函数有"未定义的引用"

我正在尝试阅读本教程:http: //www.tcpdump.org/pcap.html

现在我使用以下命令安装pcap(代码提示和所有工作):

sudo apt-get install libpcap-dev
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有以下代码(文件名是example_pcap.c):

#include <stdio.h>
#include <pcap.h>

int main(int argc, char *argv[]) {
    char *dev, errbuf[PCAP_ERRBUF_SIZE];

    dev = pcap_lookupdev(errbuf);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我已经看到的许多问题,他们说使用这个编译它:

gcc -lpcap example_pcap.c -o example_pcap
Run Code Online (Sandbox Code Playgroud)

但是我仍然收到以下错误:

example_pcap.c:(.text+0x32): undefined reference to `pcap_lookupdev'
Run Code Online (Sandbox Code Playgroud)

c linux pcap undefined-reference libpcap

11
推荐指数
1
解决办法
1万
查看次数

在Linux上编译时未定义的引用mempcy@GLIBC_2.14

我试图移植一个应用程序来驱动一个使用ftdi2332h芯片的设备从Windows到Linux.我按照这些说明在ubuntu 10.04系统上安装了libftd2xx库.

当我尝试编译任何示例程序时,我收到以下错误:

/usr/local/lib/libftd2xx.so: undefined reference to `memcpy@GLIBC_2.14'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

有关如何解决这个问题的指导原则?

c++ porting undefined-reference ftdi

10
推荐指数
2
解决办法
2万
查看次数