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 <[email protected] <mailto:[email protected]>> 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 <http://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



-- 

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

Reply via email to