Hi there I have some C code that I cross compiled for a small mobile point-of- sale device running uClinux on an arm processor.
I currently use plain Makefiles to build a number of static libs that are linked to a single exe. The Makefiles work fine, but they're messy. I want to move over to cmake because it seems simpler and neater. Building the libs with Cmake is fine. However when I try and link the libs into the final exe I get: /usr/local/lib/gcc-lib/arm-elf/2.95.3/libgcc.a(__main.o)(.text+0xc4): In function `__do_global_ctors': : undefined reference to `__CTOR_LIST__' /usr/local/lib/gcc-lib/arm-elf/2.95.3/libgcc.a(__main.o)(.data+0x0): undefined reference to `__DTOR_LIST__' I don't get this using my standard Makefiles. A quick search indicates that these references are used by C++ constructors and destructors, so I'm not sure what they have to do with my plain-old-C code. So I'm guessing that the cmake-generated Makefile is doing something different to my Normal Makefile. Details output from both methods is listed below, but in summary the differences seem to be: 1) cmake adds: -fPIC 2) cmake adds: -Wl,-rpath,.......... 3) cmake adds: -rdynamic 4) cmake links libs using -llib-name whereas my Makefile was simply treating the .a lib like an object file. for 1) I can get rid of the -fPIC by redefining CMAKE_C_COMPILE_OBJECT (or was it CMAKE_C_LINK_EXECUTABLE). for 4) Linking useing -l is probably a better option anyway. However I can't get rid of 2) and 3). Can anyone give me a clue as to what might be wrong and if it's likely to be related to 2) and 3). If so, how can I change 2) and 3)? Many thanks Henty *** More detailed output from the cmake generated Makefile: Linking C executable ../../dist/bin/lmt3000s/iPayMobilePos /usr/bin/cmake -E remove -f ../../dist/bin/lmt3000s/iPayMobilePos cd /home/hentyw/projects/ipay/iPayMobilePos-talexus.cmake/src/mposMain && arm-elf-gcc -O3 -march=armv4t -mtune=arm7tdmi -Wall --static -fPIC --static -elf2flt "CMakeFiles/iPayMobilePos.dir/logon.o" <snip list of object files> -o ../../dist/bin/lmt3000s/iPayMobilePos -rdynamic -L/home/hentyw/projects/ipay/iPayMobilePos- talexus.cmake/build/lib/lmt3000s <snip list of link directories> -lmposmod-cell -lmposmod-cellstock -lmposmod-elec -lmposmod-elecstock - lmposmod-elec2way -lmposmod-elec2way-lmt3000s -lmposmod-fin -lmposmod- retailmng -lmposmod-termmng -lmposmod-metro -lmpos -lmpos-lmt3000s - lscew -lexpat -lbz2 -lftp -lz -lkeymap -lkeybox -lm -llmt3000s_sf -Wl,- rpath,/home/hentyw/projects/ipay/iPayMobilePos- talexus.cmake/build/lib/lmt3000s:/home/hentyw/projects/ipay/iPayMobilePos-talexus.cmake/lib/bin/lmt3000s:/usr/local/arm-elf/lib:/usr/local/linudix/lib3000s/lib arm-elf-gcc: unrecognized option `-rdynamic' /usr/local/linudix/lib3000s/lib/liblmt3000s_sf.a(inputbox.o)(.text +0x1d44): In function `lmt_inputbox_double_right': : undefined reference to `ceil' /usr/local/lib/gcc-lib/arm-elf/2.95.3/libgcc.a(__main.o)(.text+0xc4): In function `__do_global_ctors': : undefined reference to `__CTOR_LIST__' /usr/local/lib/gcc-lib/arm-elf/2.95.3/libgcc.a(__main.o)(.data+0x0): undefined reference to `__DTOR_LIST__' collect2: ld returned 1 exit status *** Detailed, edited, output from my old self-generated Makefile: arm-elf-gcc -O3 -DLINUDIX -march=armv4t -mtune=arm7tdmi -Wall -Werror - I./../../../ipayapp/include -I./../../../ipaylib/include - I./../../../ipaymodules/include - I./../../../ipaymodules/elec2way/port/linudix/include - I./../../../ipaylib/port/linudix/include -I./../../../lib/include - I/usr/local/linudix/lib3000s/include -o ipaypos --static -elf2flt ./../../../ipayapp/src/logon.o <snip object list> ./../../../ipaymodules/retailmng/port/linudix/libmodretailmng.a ./../../../ipaymodules/elec2way/port/linudix/libmodelec2way.a ./../../../ipaymodules/termmng/port/linudix/libmodtermmng.a <snip lib list> /usr/local/arm-elf/lib/libm.a *** Extracts from various cmake files. Can provide full files if required: ***From a macro file MACRO (MPOS_PLATFORM_LMT3000S) SET(MPOS_PLATFORM lmt3000s) ADD_DEFINITIONS(-DMPOS_PLATFORM=lmt3000s - DMPOS_PLATFORM_MODEL=lmt3000se) SET(C_CROSS_COMPILER arm-elf-) SET(CMAKE_C_COMPILER "${C_CROSS_COMPILER}gcc") SET(CMAKE_RANLIB "${C_CROSS_COMPILER}ranlib") SET(CMAKE_AR "${C_CROSS_COMPILER}ar") SET(CMAKE_C_FLAGS "-O3 -march=armv4t -mtune=arm7tdmi -Wall --static") SET(CMAKE_COMPILER_IS_GNUCC 1) SET(CMAKE_COMPILER_IS_GNUCXX 0) SET(BUILD_SHARED_LIBS OFF) # SET(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <FLAGS> -o <OBJECT> -c <SOURCE>") # SET(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") ENDMACRO (MPOS_PLATFORM_LMT3000S) ***Called at a top level CMakeLists.txt file MPOS_PLATFORM_LMT3000S() ***Called from the lower level CMakeLists.txt file that actually ***builds the exe. ADD_EXECUTABLE(iPayMobilePos ${MPOS_MAIN_SRCS}) TARGET_LINK_LIBRARIES(iPayMobilePos ${MPOS_MODULE_LIBS} ${MPOS_LIBS} ${THIRD_PARTY_LIBS} ${MPOS_PLATFORM_LIBS}) SET_TARGET_PROPERTIES(iPayMobilePos PROPERTIES LINK_FLAGS "--static - elf2flt") #SET_TARGET_PROPERTIES(iPayMobilePos PROPERTIES SKIP_BUILD_RPATH TRUE) #SET_TARGET_PROPERTIES(iPayMobilePos PROPERTIES LINKER_LANGUAGE C) _______________________________________________ CMake mailing list CMake@cmake.org http://www.cmake.org/mailman/listinfo/cmake