[CMake] undefined reference to error when use "c" extension

J Decker d3ck0r at gmail.com
Fri Jun 5 22:44:57 EDT 2015


it's not the lib, it's the header interface to the lib.

On Fri, Jun 5, 2015 at 7:42 PM, Sunrise <helios.corona at gmail.com> wrote:

>  Thanks for your reply. I am aware of extern "C" {} but this is not an
> option for me. As I mentioned, there are a lot of lib files (which were not
> written by me) and I was wondering if lib itself could be untouched.
>
>
> On 06/05/2015 07:33 PM, J Decker wrote:
>
> c++ does name mangling on functions... so functions like 'f' become a much
> more complex name (as shown in the xxx not found in your error messages).
> In order for C++ to not produce a mangled name C functions have to be
> defined as
>
>  extern "c" void f( void );
> but 'extern "c"' is not liked by C... so you really need to define in the
> shared header something like...
>
>  #ifdef __cplusplus
> #define CEXTERN extern "C"
> #ese
> #define CEXTERN
> #endif
>
>  CEXTERN void f( void );
>
>  But of course since you don't know about name mangling I guess you don't
> know proper header usage either.  This is not a cmake issue, but a general
> C++ issue... and you'd do better asking stack exchange or something.
>
> On Fri, Jun 5, 2015 at 6:37 PM, Sunrise <helios.corona at gmail.com> wrote:
>
>>  Hello,
>>
>> I am linking my code to a library. My code is in C++ but the library is
>> in C.
>>
>> The problem is that whenever the extension of library implementations are
>> "c" (not cpp), they are not linked and I get "undefined reference to"
>> error.
>>
>> Here is an example:
>>
>> Suppose I have
>> ./src/main.cpp   // as main file
>> ./include/lib.h
>> ./include/lib.c  // as a library
>>
>> And the cmake file is
>>
>> cmake_minimum_required(VERSION 2.8)
>> project(myproj)
>>
>> set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
>> include_directories(${INCLUDE_DIR})
>> add_library(MY_LIB ${INCLUDE_DIR}/Lib.c)
>>
>> set(EXECUTABLE_NAME "myproj")
>> set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
>> add_executable(myproj ${SOURCE_DIR}/main.cpp)
>>
>> target_link_libraries(myproj MY_LIB)
>>
>> This returns undefined reference to error, but if I rename lib.c to
>> lib.cpp, everything works fine.
>>
>> How can I resolve this? I do not want to rename the file to cpp, because
>> there are a lot of library files and I prefer to keep the library
>> implementations untouched.
>>
>> Thanks.
>>
>> --
>>
>> Powered by www.kitware.com
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Kitware offers various services to support the CMake community. For more
>> information on each offering, please visit:
>>
>> CMake Support: http://cmake.org/cmake/help/support.html
>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/cmake
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20150605/029f7ef3/attachment.html>


More information about the CMake mailing list