我正在使用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的未定义符号:
Run Code Online (Sandbox Code Playgroud)"void my_callback<int>(void*)", referenced from: _main in ccYLXc5w.o
我觉得这是可以理解的.
通过显式实例化模板可以轻松解决此问题:
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)
通过调用函数隐式实例化函数模板.所以我们这样做,但要确保调用没有实际执行(该函数有副作用): …
我最近在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) 我正在尝试在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.
我正在实现一个OpenSSL代码并且已经包含了必需的头文件,但我仍然遇到像*这样的错误
未定义的引用
SSL_library_init
我想这是一个链接错误而不是编译错误.
我正在使用slickeditor在Linux机箱中实现它.
我已经看过几个其他帖子来处理这个完全相同的问题.但是,他们的解决方案似乎都不适合我.我编译如下代码:
__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__自己,虽然我还没有尝试过. …
我正在尝试使用交叉编译器(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更改printf为puts,它似乎自动为一个简单的换行终止字符串.
我已经构建了一个交叉编译器${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) 这是我的线程子例程...... 在这里,我创建了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) 我有一个简单的程序来测试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) 我正在尝试阅读本教程: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) 我试图移植一个应用程序来驱动一个使用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)
有关如何解决这个问题的指导原则?