Hi Ralph, I think that I have solved the problem somehow. Here is a patch for libtool.m4 which adds support for C++ for nvcc. It prepends -Xcompiler to -fPIC as well as it is for C and also -Xlinker infront of -nostdlib.
3653a3654,3660 > > case $cc_basename in > nvcc*) # Cuda Compiler Driver 2.2 > _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' > _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' > ;; > esac 5523,5527c5530,5544 < _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' < _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' < < _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' < _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' --- > # Checking if we use nvcc (CUDA 2.2,2.3) linker as 'front-end' to GNU C++. > # In this case we add -Xlinker parameter in front of -nostdlib. > if test "$cc_basename" = nvcc; then > _LT_TAGVAR(archive_cmds, $1)='$CC -shared -Xlinker -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' > _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -Xlinker - nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' > > _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' > _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' > else > _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' > _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' > > _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' > _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' > fi Now I am able to compile and link my project. However, I had also problems with depcomp which is (as I understood) part of automake. nvcc did not accept parameters like -MT -MF etc. I planed to fix it again using -Xcompiler but now these parameters do not appear. So I will see. Cheers, Tomas. Dne středa 06 Leden 2010 08:44:57 Ralf Wildenhues napsal(a): > Hello Tomas, > > * Tomas Oberhuber wrote on Sat, Jan 02, 2010 at 11:33:46AM CET: > > Now I try to compile whole project with nvcc. It seems to work but I get > > this > > > > ibtool: link: > > nvcc -shared -nostdlib > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugStructu > >re.o .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-parse.o > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugGroup.o > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugParser. > >o .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebug.o > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugScanner > >.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlParameterConta > >iner.o .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlString.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlTimerCPU.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlTimerRT.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlConfigDescript > >ion.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlConfigDescript > >ionScanner.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-mpi-supp.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlTester.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-parse.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlConfigDescript > >ionParser.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlObject.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-compress-file.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-mfilename.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlLogger.o > > .libs/libtnl-0.1.lax/libtnlmatrix-0.1.a/libtnlmatrix_0_1_la-tnlBaseMatrix > >.o -L/usr/local/cuda/lib64 -lcppunit -lcudart -Wl,-soname > > -Wl,libtnl-0.1.so.0 -o .libs/libtnl-0.1.so.0.0.0 nvcc fatal : Unknown > > option 'nostdlib' > > > > which means that nvcc is also used as linker. Even if I remove -nostdlib, > > nvcc complains about other parameters. So I think it would be better to > > link with g++. Can I change linker somehow? And in that case if I do it > > by hand (copy the command on the command line and replace nvcc by g++) I > > get this > > > > g++ -shared -nostdlib > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugStructu > >re.o .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-parse.o > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugGroup.o > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugParser. > >o .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebug.o > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugScanner > >.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlParameterConta > >iner.o .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlString.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlTimerCPU.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlTimerRT.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlConfigDescript > >ion.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlConfigDescript > >ionScanner.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-mpi-supp.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlTester.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-parse.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlConfigDescript > >ionParser.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlObject.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-compress-file.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-mfilename.o > > .libs/libtnl-0.1.lax/libtnlcore-0.1.a/libtnlcore_0_1_la-tnlLogger.o > > .libs/libtnl-0.1.lax/libtnlmatrix-0.1.a/libtnlmatrix_0_1_la-tnlBaseMatrix > >.o -L/usr/local/cuda/lib64 -lcppunit -lcudart -Wl,-soname > > -Wl,libtnl-0.1.so.0 -o .libs/libtnl-0.1.so.0.0.0 /usr/bin/ld: > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugStructu > >re.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when > > making a shared object; recompile with -fPIC > > .libs/libtnl-0.1.lax/libtnldebug-0.1.a/libtnldebug_0_1_la-tnlDebugStructu > >re.o: could not read symbols: Bad value > > collect2: ld returned 1 exit status > > > > Or maybe we can solve it using -Xcompiler nad -Xlinker. May I ask what > > does libtool do now in case we use nvcc to compile or link? > > You're right. Libtool doesn't support CXX=nvcc yet, and we also forgot > some bits of CC=nvcc support. This still needs to be done in Libtool. > > Thanks, > Ralf >