I'm trying to develop a packet analyzer with CUDA support for pattern matching. I'm using GTK+ for GUI creation but I am not able to compile the GUI file together with the cuda files. How to write makefile for this case?
The project is having two parts: 1. Analyzer 2. GUI
Analyzer consists of many .c,.h files and one .cu file.
GUI part has only one file gui.c
I have included packet_analyzer.h in gui.c.
I tried the following makefile
all: guitest
guitest: gui.o list.o queue.o Word.o dictionary.o packet_capturer.o rule.o aho-corasick.o aho-corasick_cuda.o packet_analyzer.o
gcc -lpcap -lpthread `pkg-config --cflags --libs gtk+-2.0` gui.o list.o queue.o Word.o dictionary.o packet_capturer.o rule.o aho-corasick.o aho-corasick_cuda.o packet_analyzer.o
gui.o: gui.c
gcc -lpcap -lpthread -c `pkg-config --cflags --libs gtk+-2.0` gui.c
list.o : list.c
gcc -c list.c
queue.o : queue.c
gcc -c queue.c
Word.o : Word.c Word.h
gcc -c Word.c
dictionary.o : dictionary.c
gcc -c dictionary.c
rule.o : rule.c rule.h
gcc -c rule.c rule.h
packet_capturer.o : packet_capturer.c
gcc -lpcap -lpthread -c packet_capturer.c
aho-corasick.o : aho-corasick.c
gcc -lpcap -lpthread -c aho-corasick.c
aho-corasick_cuda.o : aho-corasick_cuda.cu
nvcc -lpcap -lpthread -c aho-corasick_cuda.cu
packet_analyzer.o : packet_analyzer.c
gcc -lpcap -lpthread -c packet_analyzer.c
clean:
rm -rf *o guitest
i end up with the following errors:
aho-corasick_cuda.o: In function `transfer_tries_from_hosttodevice(int, int, int)':
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x37): undefined reference to `cudaMalloc'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x5d): undefined reference to `cudaMalloc'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x86): undefined reference to `cudaMalloc'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0xac): undefined reference to `cudaMalloc'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0xd5): undefined reference to `cudaMalloc'
aho-corasick_cuda.o:tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0xfb): more undefined references to `cudaMalloc' follow
aho-corasick_cuda.o: In function `transfer_tries_from_hosttodevice(int, int, int)':
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x132): undefined reference to `cudaMemcpy'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x166): undefined reference to `cudaMemcpy'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x19d): undefined reference to `cudaMemcpy'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x1d1): undefined reference to `cudaMemcpy'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x208): undefined reference to `cudaMemcpy'
aho-corasick_cuda.o:tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x23c): more undefined references to `cudaMemcpy' follow
aho-corasick_cuda.o: In function `transfer_packets_from_hosttodevice(void*)':
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x3b1): undefined reference to `Queue_dequeue(Queue*)'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x519): undefined reference to `cudaMalloc'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x52b): undefined reference to `cudaMalloc'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x53d): undefined reference to `cudaMalloc'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x56b): undefined reference to `cudaMemcpy'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x58b): undefined reference to `cudaMemcpy'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x5ab): undefined reference to `cudaMemcpy'
aho-corasick_cuda.o: In function `analyze_packets(void*)':
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x663): undefined reference to `cudaMalloc'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x683): undefined reference to `cudaMemcpy'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x6dd): undefined reference to `cudaConfigureCall'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x777): undefined reference to `cudaMemcpy'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x78a): undefined reference to `Queue_dequeue(Queue*)'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x7d5): undefined reference to `Queue_enqueue(Queue*, void*)'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x7f3): undefined reference to `cudaFree'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x802): undefined reference to `cudaFree'
aho-corasick_cuda.o: In function `__cudaUnregisterBinaryUtil()':
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x824): undefined reference to `__cudaUnregisterFatBinary'
aho-corasick_cuda.o: In function `__device_stub__Z14AC_search_CudaPiS_S_S_S_S_S_S_PhiS_(int*, int*, int*, int*, int*, int*, int*, int*, unsigned char*, int, int*)':
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x85c): undefined reference to `cudaSetupArgument'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x87f): undefined reference to `cudaSetupArgument'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x8a2): undefined reference to `cudaSetupArgument'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x8c5): undefined reference to `cudaSetupArgument'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x8e8): undefined reference to `cudaSetupArgument'
aho-corasick_cuda.o:tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0x90b): more undefined references to `cudaSetupArgument' follow
aho-corasick_cuda.o: In function `__sti____cudaRegisterAll_52_tmpxft_00001608_00000000_4_aho_corasick_cuda_cpp1_ii_9958a654()':
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0xa82): undefined reference to `__cudaRegisterFatBinary'
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text+0xae3): undefined reference to `__cudaRegisterFunction'
aho-corasick_cuda.o: In function `cudaError cudaLaunch<char>(char*)':
tmpxft_00001608_00000000-1_aho-corasick_cuda.cudafe1.cpp:(.text._Z10cudaLaunchIcE9cudaErrorPT_[cudaError cudaLaunch<char>(char*)]+0x14): undefined reference to `cudaLaunch'
aho-corasick_cuda.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
make: *** [guitest] Error 1
You need to link with the CUDA runtime library. Add -lcudart to your link command (and CUDA lib path if necessary).
It's the nvcc -lpcap -lpthread $(ANALYZER) -o packet_analyzer.o line that's failing, right? With the -o option, you're telling it to build a complete executable, not just the object files. It needs a main function to do that, which I presume you don't have in any of the $(ANALYZER) files. Instead, try compiling all the sources with the -c flag (like you've done with gcc for gui.c), and then wrap it all together and link it with the other gcc command.
Related
I got an error when compiling glibc and googled it for a long time and didn't get it! This is the output of the compiler:
x86_64-pc-linux-gnu-gcc -nostdlib -nostartfiles -shared -o /mnt/g/gcc/build/build-glibc-2.35/elf/ld.so.new \
-Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs \
/mnt/g/gcc/build/build-glibc-2.35/elf/librtld.os -Wl,--version-script=/mnt/g/gcc/build/build-glibc-2.35/ld.ma\
-Wl,-soname=ld-linux-x86-64.so.2 \
-Wl,-defsym=_begin=0
/usr/sbin/ld: /mnt/g/gcc/build/build-glibc-2.35/elf/librtld.os: in function `_dl_make_stacks_executable':
/mnt/g/gcc/build/glibc-2.35/elf/../sysdeps/unix/sysv/linux/dl-execstack.c:69: undefined reference to `__lll_lock_wait_private'
/usr/sbin/ld: /mnt/g/gcc/build/glibc-2.35/elf/../sysdeps/unix/sysv/linux/dl-execstack.c:91: undefined reference to `__lll_lock_wake_private'
/usr/sbin/ld: /mnt/g/gcc/build/build-glibc-2.35/elf/librtld.os: in function `__thread_gscope_wait':
/mnt/g/gcc/build/glibc-2.35/elf/../sysdeps/nptl/dl-thread_gscope_wait.c:79: undefined reference to `__lll_lock_wake_private'
/usr/sbin/ld: /mnt/g/gcc/build/glibc-2.35/elf/../sysdeps/nptl/dl-thread_gscope_wait.c:28: undefined reference to `__lll_lock_wait_private'
/usr/sbin/ld: /mnt/g/gcc/build/build-glibc-2.35/elf/librtld.os: in function `_dl_init_static_tls':
/mnt/g/gcc/build/glibc-2.35/elf/../elf/dl-tls.c:1092: undefined reference to `__lll_lock_wait_private'
/usr/sbin/ld: /mnt/g/gcc/build/glibc-2.35/elf/../elf/dl-tls.c:1103: undefined reference to `__lll_lock_wake_private'
I need help with compilation of P3DFFT. I'm literally lost in the process, because the compiler is complaining about "undefined reference" to lots of symbols, but those symbols are present in the libraries.
My command:
mpicc -g -O2 -I../../include -L/home/martin/fftw3/libs -lfftw3 /home/martin/p3dfft/build/libp3dfft.a driver_rand.c -o driver_rand
Compiler output:
driver_rand.c: In function ‘main’:
driver_rand.c:114:10: warning: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result [-Wunused-result]
fscanf(fp,"%d %d %d %d %d\n",&nx,&ny,&nz,&ndim,&n);
^
driver_rand.c:137:8: warning: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result [-Wunused-result]
fscanf(fp,"%d %d\n",dims,dims+1);
^
/tmp/cc52N8Sc.o: In function `Cp3dfft_setup':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:90: undefined reference to `p3dfft_setup'
/tmp/cc52N8Sc.o: In function `Cp3dfft_get_dims':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:100: undefined reference to `p3dfft_get_dims'
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:100: undefined reference to `p3dfft_get_dims'
/tmp/cc52N8Sc.o: In function `Cp3dfft_clean':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:95: undefined reference to `p3dfft_clean'
/tmp/cc52N8Sc.o: In function `Cget_timers':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:105: undefined reference to `get_timers'
/tmp/cc52N8Sc.o: In function `Cset_timers':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:110: undefined reference to `set_timers'
/tmp/cc52N8Sc.o: In function `Cp3dfft_ftran_r2c':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:117: undefined reference to `p3dfft_ftran_r2c'
/tmp/cc52N8Sc.o: In function `Cp3dfft_btran_c2r':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:130: undefined reference to `p3dfft_btran_c2r'
/tmp/cc52N8Sc.o: In function `main':
/home/martin/p3dfft/sample/C/driver_rand.c:106: undefined reference to `set_timers'
/tmp/cc52N8Sc.o: In function `Cp3dfft_setup':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:90: undefined reference to `p3dfft_setup'
/tmp/cc52N8Sc.o: In function `Cp3dfft_get_dims':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:100: undefined reference to `p3dfft_get_dims'
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:100: undefined reference to `p3dfft_get_dims'
/tmp/cc52N8Sc.o: In function `Cp3dfft_ftran_r2c':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:117: undefined reference to `p3dfft_ftran_r2c'
/tmp/cc52N8Sc.o: In function `Cp3dfft_btran_c2r':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:130: undefined reference to `p3dfft_btran_c2r'
/tmp/cc52N8Sc.o: In function `Cp3dfft_clean':
/home/martin/p3dfft/sample/C/../../include/p3dfft.h:95: undefined reference to `p3dfft_clean'
/tmp/cc52N8Sc.o: In function `main':
/home/martin/p3dfft/sample/C/driver_rand.c:258: undefined reference to `get_timers'
collect2: error: ld returned 1 exit status
Undefined symbols ARE present in libp3dfft.a:
nm ../../build/libp3dfft.a --defined-only | grep 'p3dfft_setup'
000000000000d030 T __p3dfft_MOD_p3dfft_setup
0000000000010ed0 T p3dfft_setup
nm ../../build/libp3dfft.a --defined-only | grep 'get_timers'
00000000000052f0 T get_timers
0000000000005230 T __p3dfft_MOD_get_timers
Do you have ANY idea what am I doing wrong?
I'm not familiar with your particular compiler, but I think you may need to correct the order of the source file and the libraries on your command line, i.e.
mpicc -g -O2 -I../../include -L/home/martin/fftw3/libs -lfftw3 /home/martin/p3dfft/build/libp3dfft.a driver_rand.c -o driver_rand
should probably be:
mpicc -g -O2 -I../../include driver_rand.c /home/martin/p3dfft/build/libp3dfft.a -L/home/martin/fftw3/libs -lfftw3 -o driver_rand
I'm attempting to follow the steps on http://llvm.org/docs/tutorial/LangImpl3.html to build the example.
based on
Building llvm examples
#error "Must #define __STDC_LIMIT_MACROS before #including Support/DataTypes.h"
Why am I getting "undefined reference to `dladdr'" even with -ldl for this simple program?
I've ended up with the command
clang++ -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -std=c++11 -g -O3 toy.cpp `llvm-config --libs core --cppflags --ldflags` -o toy
which is giving
/usr/local/lib/libLLVMSupport.a(Mutex.o): In function `llvm::sys::MutexImpl::MutexImpl(bool)':
/home/abdev/llvmHome/llvm/lib/Support/Mutex.cpp:53: undefined reference to `pthread_mutexattr_init'
/home/abdev/llvmHome/llvm/lib/Support/Mutex.cpp:59: undefined reference to `pthread_mutexattr_settype'
/home/abdev/llvmHome/llvm/lib/Support/Mutex.cpp:67: undefined reference to `pthread_mutexattr_destroy'
/usr/local/lib/libLLVMSupport.a(Mutex.o): In function `llvm::sys::MutexImpl::tryacquire()':
/home/abdev/llvmHome/llvm/lib/Support/Mutex.cpp:109: undefined reference to `pthread_mutex_trylock'
/usr/local/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::RWMutexImpl()':
/home/abdev/llvmHome/llvm/lib/Support/RWMutex.cpp:59: undefined reference to `pthread_rwlock_init'
/usr/local/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::~RWMutexImpl()':
/home/abdev/llvmHome/llvm/lib/Support/RWMutex.cpp:72: undefined reference to `pthread_rwlock_destroy'
/usr/local/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::reader_acquire()':
/home/abdev/llvmHome/llvm/lib/Support/RWMutex.cpp:82: undefined reference to `pthread_rwlock_rdlock'
/usr/local/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::reader_release()':
/home/abdev/llvmHome/llvm/lib/Support/RWMutex.cpp:92: undefined reference to `pthread_rwlock_unlock'
/usr/local/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::writer_acquire()':
/home/abdev/llvmHome/llvm/lib/Support/RWMutex.cpp:102: undefined reference to `pthread_rwlock_wrlock'
/usr/local/lib/libLLVMSupport.a(RWMutex.o): In function `llvm::sys::RWMutexImpl::writer_release()':
/home/abdev/llvmHome/llvm/lib/Support/RWMutex.cpp:112: undefined reference to `pthread_rwlock_unlock'
/usr/local/lib/libLLVMSupport.a(Signals.o): In function `llvm::sys::PrintStackTrace(_IO_FILE*)':
/home/abdev/llvmHome/llvm/lib/Support/Unix/Signals.inc:278: undefined reference to `dladdr'
/home/abdev/llvmHome/llvm/lib/Support/Unix/Signals.inc:290: undefined reference to `dladdr'
/usr/local/lib/libLLVMSupport.a(ThreadLocal.o): In function `llvm::sys::ThreadLocalImpl::ThreadLocalImpl()':
/home/abdev/llvmHome/llvm/lib/Support/ThreadLocal.cpp:56: undefined reference to `pthread_key_create'
/usr/local/lib/libLLVMSupport.a(ThreadLocal.o): In function `llvm::sys::ThreadLocalImpl::~ThreadLocalImpl()':
/home/abdev/llvmHome/llvm/lib/Support/ThreadLocal.cpp:63: undefined reference to `pthread_key_delete'
/usr/local/lib/libLLVMSupport.a(ThreadLocal.o): In function `llvm::sys::ThreadLocalImpl::setInstance(void const*)':
/home/abdev/llvmHome/llvm/lib/Support/ThreadLocal.cpp:70: undefined reference to `pthread_setspecific'
/usr/local/lib/libLLVMSupport.a(ThreadLocal.o): In function `llvm::sys::ThreadLocalImpl::getInstance()':
/home/abdev/llvmHome/llvm/lib/Support/ThreadLocal.cpp:77: undefined reference to `pthread_getspecific'
/usr/local/lib/libLLVMSupport.a(Threading.o): In function `llvm::llvm_execute_on_thread(void (*)(void*), void*, unsigned int)':
/home/abdev/llvmHome/llvm/lib/Support/Threading.cpp:91: undefined reference to `pthread_attr_setstacksize'
/home/abdev/llvmHome/llvm/lib/Support/Threading.cpp:96: undefined reference to `pthread_create'
/home/abdev/llvmHome/llvm/lib/Support/Threading.cpp:100: undefined reference to `pthread_join'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Am I missing a library, or is some of the order incorrect?
I believe you need to link with -lpthread or just -pthread
I tried to put up an example using c++ for accessing Cassandra, and so Using Thrift.
Copying the example, I had this strange situation:
storm#debian:~/Script/goh-server/src/cassandra$ g++ -I/usr/include/thrift/ -c prova.cpp -o prova.o
storm#debian:~/Script/goh-server/src/cassandra$ g++ -I/usr/include/thrift/ -c cassandra_constants.cpp -o cassandra_constants.o
storm#debian:~/Script/goh-server/src/cassandra$ g++ -I/usr/include/thrift/ -c cassandra_types.cpp -o cassandra_types.o
storm#debian:~/Script/goh-server/src/cassandra$ g++ -I/usr/include/thrift/ -c Cassandra.cpp -o Cassandra.o
g++storm#debian:~/Script/goh-server/src/cassandra$ g++ -lthrift *.o -o prova
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_login()':
Cassandra.cpp:(.text+0x12d2c): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)'
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_set_keyspace()':
Cassandra.cpp:(.text+0x1339c): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)'
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_get(org::apache::cassandra::ColumnOrSuperColumn&)':
Cassandra.cpp:(.text+0x13a0b): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)'
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_get_slice(std::vector<org::apache::cassandra::ColumnOrSuperColumn, std::allocator<org::apache::cassandra::ColumnOrSuperColumn> >&)':
Cassandra.cpp:(.text+0x142db): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)'
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_get_count()':
Cassandra.cpp:(.text+0x14b40): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)'
Cassandra.o:Cassandra.cpp:(.text+0x153bd): more undefined references to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' follow
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process(boost::shared_ptr<apache::thrift::protocol::TProtocol>, boost::shared_ptr<apache::thrift::protocol::TProtocol>, void*)':
Cassandra.cpp:(.text+0x21511): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const'
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process_fn(apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int, void*)':
Cassandra.cpp:(.text+0x21882): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const'
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process_login(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)':
Cassandra.cpp:(.text+0x21fa8): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const'
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process_set_keyspace(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)':
Cassandra.cpp:(.text+0x2291e): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const'
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process_get(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)':
Cassandra.cpp:(.text+0x233b9): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const'
Cassandra.o:Cassandra.cpp:(.text+0x23e16): more undefined references to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' follow
prova.o: In function `main':
prova.cpp:(.text+0x6e): undefined reference to `apache::thrift::transport::TSocket::TSocket(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'
prova.o: In function `apache::thrift::transport::TFramedTransport::TFramedTransport(boost::shared_ptr<apache::thrift::transport::TTransport>)':
prova.cpp:(.text._ZN6apache6thrift9transport16TFramedTransportC1EN5boost10shared_ptrINS1_10TTransportEEE[apache::thrift::transport::TFramedTransport::TFramedTransport(boost::shared_ptr<apache::thrift::transport::TTransport>)]+0x26): undefined reference to `vtable for apache::thrift::transport::TFramedTransport'
collect2: ld returned 1 exit status
storm#debian:~/Script/goh-server/src/cassandra$ ls
cassandra_constants.cpp cassandra_constants.o Cassandra.h cassandra_types.cpp cassandra_types.o prova.o
cassandra_constants.h Cassandra.cpp Cassandra.o cassandra_types.h prova.cpp
Then, with some Voodoo I tried to move the -l switch at the end of the linking order, and magically ...
storm#debian:~/Script/goh-server/src/cassandra$ g++ *.o -o prova -lthrift
storm#debian:~/Script/goh-server/src/cassandra$
On the Thrift documentation, the -l switch is put in the beginning, and in fact automake DOES put it before the '*.o's and -o switch.
What's wrong with it ?
Edit:
In fact is not true that automake put -l flags in the beginning. It does put them in the end in the linking stage. Still: why does the order matter ?
It matters. -llibrary must follow everything that references the library.
If you have circular references between static libraries, you end up with -llibrary twice.
http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/example/allocation/server.cpp
g++ -L./lib/boost_1_41_0/ -L./lib/soci-3.0.0/ -L/usr/lib/ -L/usr/local/lib/ -L./ -I/usr/include -I./lib/boost_1_41_0 -o main server.o -lssl -pthread
server.o: In function `error_code':
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:315: undefined reference to `boost::system::get_system_category()'
server.o: In function `get_system_category':
/test/mycode/./lib/boost_1_41_0/boost/asio/error.hpp:218: undefined reference to `boost::system::get_system_category()'
server.o: In function `error_code':
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:315: undefined reference to `boost::system::get_system_category()'
server.o: In function `__static_initialization_and_destruction_0':
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:208: undefined reference to `boost::system::get_system_category()'
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:209: undefined reference to `boost::system::get_generic_category()'
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:214: undefined reference to `boost::system::get_generic_category()'
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:215: undefined reference to `boost::system::get_generic_category()'
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:216: undefined reference to `boost::system::get_system_category()'
server.o: In function `error_code':
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:315: undefined reference to `boost::system::get_system_category()'
server.o: In function `get_system_category':
/test/mycode/./lib/boost_1_41_0/boost/asio/error.hpp:218: undefined reference to `boost::system::get_system_category()'
server.o: In function `error_code':
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:315: undefined reference to `boost::system::get_system_category()'
/test/mycode/./lib/boost_1_41_0/boost/system/error_code.hpp:315: undefined reference to `boost::system::get_system_category()'
server.o:/test/mycode/./lib/boost_1_41_0/boost/asio/error.hpp:218: more undefined references to `boost::system::get_system_category()' follow
collect2: ld returned 1 exit status
make: *** [main] Error 1
How to remove the above error
You want -lboost_system.
The Boost build system builds multiple variants of a single library. For example, a thread safe version of that library is -lboost_system-mt. To understand how the variants are named, see the Boost documentation.