[CMake] SHARED library containing OBJECT library: Missing -fPIC

David Cole david.cole at kitware.com
Mon Jun 25 07:51:50 EDT 2012


On Sun, Jun 24, 2012 at 10:05 AM, Benjamin Eikel <cmake at eikel.org> wrote:
> Hello Leif,
>
> Am Freitag, 22. Juni 2012 um 15:55:55 schrieb Leif Walsh:
>> I tried this in my project. I added -fPIC to the COMPILE_FLAGS property of
>> the object library and it worked, but then you also get PIC static
>> libraries (which isn't that big of a deal). But time your compiles.
>> Usually the compilation of individual c files is well dominated by the
>> linking time, especially with optimization. So to reduce technical risk, I
>> opted just to build each library the old fashioned way and compile objects
>> twice. I saw pretty much no compile time difference. But maybe you have
>> other reasons.
>
> maybe I did not make things clear enough. I do not want to build the same
> library twice (static and dynamic). I just wanted to know if it is really
> required to add the compiler specific compile flag "-fPIC" manually when using
> object libraries for building a shared library. I know that there will be a
> compiler independent target property in CMake 2.8.9. But nevertheless, being
> forced to add this flags seems somehow cumbersome to me. When building a normal
> shared library composed only of source files, I do not have to add the flag, but
> it is automatically added by CMake.
>
> Kind regards
> Benjamin
>

Yes, it is necessary. CMake does not do this automatically until using
the new 2.8.9 and setting the POSITION_INDEPENDENT_CODE property.

Prior to that, you have to add the compiler-specific flag yourself as needed.



>>
>> Sent from my iPhone
>>
>> On Jun 22, 2012, at 5:46, Andreas Naumann <Andreas-Naumann at gmx.net> wrote:
>> > I think the latter is the case. It should not be allowed to compose a
>> > shared library from OBJECT libraries. What does the cmake developer
>> > think about this problem?
>> >
>> > Regards,
>> > Andreas
>> >
>> > Am 22.06.2012 11:14, schrieb Benjamin Eikel:
>> >> Hello Andreas,
>> >>
>> >> Am Freitag, 22. Juni 2012, 11:09:36 schrieb Andreas Naumann:
>> >>> Hello Benjamin,
>> >>>
>> >>> if you wants to use an object file for a shared library, this object
>> >>> file has to be compiled with -fPIC. I don't think, that it is possible
>> >>> to create a shared library from such object files.
>> >>
>> >> I know that this is the case. My question is not directed to -fPIC in
>> >> general, but to CMake's handling of these files. I want to use CMake's
>> >> new OBJECT library feature to structure the build of a library. The
>> >> library is built statically as well as dynamically. When building
>> >> statically, there is no problem in using the OBJECT libraries of CMake.
>> >> But when building dynamically, the problem described in my original
>> >> e-mail arises. CMake's documentation does not say that it is not
>> >> allowed to use OBJECT libraries to compose shared libraries.
>> >>
>> >> Kind regards
>> >> Benjamin
>> >>
>> >>> Regards,
>> >>> Andreas
>> >>>
>> >>> Am 22.06.2012 09:50, schrieb Benjamin Eikel:
>> >>>> Hello,
>> >>>>
>> >>>> I have a problem using an OBJECT library that I want to compile into a
>> >>>> SHARED library using CMake version 2.8.8.
>> >>>>
>> >>>> Here is a small example that demonstrates my problem:
>> >>>>
>> >>>> # --------------- CMakeLists.txt ---------------
>> >>>> cmake_minimum_required(VERSION 2.8.8)
>> >>>> project(CMakeTest CXX)
>> >>>> add_library(MyLibSub OBJECT
>> >>>>
>> >>>>          ClassA.cpp
>> >>>>
>> >>>> )
>> >>>> add_library(MyLib SHARED
>> >>>>
>> >>>>          $<TARGET_OBJECTS:MyLibSub>
>> >>>>          ClassB.cpp
>> >>>>
>> >>>> )
>> >>>>
>> >>>> The content of the other four files is more or less irrelevant. To
>> >>>> make the example complete, I added them at the end of this e-mail.
>> >>>>
>> >>>> When I want to build this example, I get the following error:
>> >>>>
>> >>>> $ mkdir build&&   cd build&&   cmake ..&&   make
>> >>>> -- The CXX compiler identification is GNU 4.7.0
>> >>>> -- Check for working CXX compiler: /usr/bin/c++
>> >>>> -- Check for working CXX compiler: /usr/bin/c++ -- works
>> >>>> -- Detecting CXX compiler ABI info
>> >>>> -- Detecting CXX compiler ABI info - done
>> >>>> -- Configuring done
>> >>>> -- Generating done
>> >>>> -- Build files have been written to: /home/benjamin/Desktop/CMake
>> >>>> test/build Scanning dependencies of target MyLibSub
>> >>>> [ 50%] Building CXX object CMakeFiles/MyLibSub.dir/ClassA.cpp.o
>> >>>> [ 50%] Built target MyLibSub
>> >>>> Scanning dependencies of target MyLib
>> >>>> [100%] Building CXX object CMakeFiles/MyLib.dir/ClassB.cpp.o
>> >>>> Linking CXX shared library libMyLib.so
>> >>>> /usr/bin/ld: CMakeFiles/MyLibSub.dir/ClassA.cpp.o: relocation
>> >>>> R_X86_64_32 against `.rodata' can not be used when making a shared
>> >>>> object; recompile with -fPIC
>> >>>> CMakeFiles/MyLibSub.dir/ClassA.cpp.o: could not read symbols: Bad
>> >>>> value collect2: error: ld returned 1 exit status
>> >>>> make[2]: *** [libMyLib.so] Error 1
>> >>>> make[1]: *** [CMakeFiles/MyLib.dir/all] Error 2
>> >>>> make: *** [all] Error 2
>> >>>>
>> >>>> When I add the line
>> >>>> set_target_properties(MyLibSub PROPERTIES COMPILE_FLAGS "-fPIC")
>> >>>> to the CMakeLists.txt, everything works fine. Am I doing something
>> >>>> wrong? Should CMake add "-fPIC" automatically in this case? Your
>> >>>> feedback is greatly appreciated.
>> >>>>
>> >>>> Kind regards
>> >>>> Benjamin
>> >>>>
>> >>>>
>> >>>>
>> >>>> // --------------- ClassA.cpp ---------------
>> >>>> #include "ClassA.h"
>> >>>> #include<iostream>
>> >>>>
>> >>>> void ClassA::printName() {
>> >>>>
>> >>>>          std::cout<<   "ClassA"<<   std::endl;
>> >>>>
>> >>>> }
>> >>>> // --------------- ClassA.h ---------------
>> >>>> #ifndef CLASSA_H
>> >>>> #define CLASSA_H
>> >>>>
>> >>>> struct ClassA {
>> >>>>
>> >>>>          void printName();
>> >>>>
>> >>>> };
>> >>>>
>> >>>> #endif /* CLASSA_H */
>> >>>> // --------------- ClassB.cpp ---------------
>> >>>> #include "ClassB.h"
>> >>>> #include<iostream>
>> >>>>
>> >>>> void ClassB::printName() {
>> >>>>
>> >>>>          std::cout<<   "ClassB"<<   std::endl;
>> >>>>          a.printName();
>> >>>>
>> >>>> }
>> >>>> // --------------- ClassB.h ---------------
>> >>>> #ifndef CLASSB_H
>> >>>> #define CLASSB_H
>> >>>>
>> >>>> #include "ClassA.h"
>> >>>>
>> >>>> struct ClassB {
>> >>>>
>> >>>>          void printName();
>> >>>>          ClassA a;
>> >>>>
>> >>>> };
>> >>>>
>> >>>> #endif /* CLASSB_H */
>> >>>>
>> >>>> --
>> >>>>
>> >>>> Powered by www.kitware.com
>> >>>>
>> >>>> Visit other Kitware open-source projects at
>> >>>> http://www.kitware.com/opensource/opensource.html
>> >>>>
>> >>>> Please keep messages on-topic and check the CMake FAQ at:
>> >>>> http://www.cmake.org/Wiki/CMake_FAQ
>> >>>>
>> >>>> Follow this link to subscribe/unsubscribe:
>> >>>> http://www.cmake.org/mailman/listinfo/cmake
>> >>>
>> >>> --
>> >>>
>> >>> Powered by www.kitware.com
>> >>>
>> >>> Visit other Kitware open-source projects at
>> >>> http://www.kitware.com/opensource/opensource.html
>> >>>
>> >>> Please keep messages on-topic and check the CMake FAQ at:
>> >>> http://www.cmake.org/Wiki/CMake_FAQ
>> >>>
>> >>> Follow this link to subscribe/unsubscribe:
>> >>> http://www.cmake.org/mailman/listinfo/cmake
>> >>
>> >> --
>> >>
>> >> Powered by www.kitware.com
>> >>
>> >> Visit other Kitware open-source projects at
>> >> http://www.kitware.com/opensource/opensource.html
>> >>
>> >> Please keep messages on-topic and check the CMake FAQ at:
>> >> http://www.cmake.org/Wiki/CMake_FAQ
>> >>
>> >> Follow this link to subscribe/unsubscribe:
>> >> http://www.cmake.org/mailman/listinfo/cmake
>> >
>> > --
>> >
>> > Powered by www.kitware.com
>> >
>> > Visit other Kitware open-source projects at
>> > http://www.kitware.com/opensource/opensource.html
>> >
>> > Please keep messages on-topic and check the CMake FAQ at:
>> > http://www.cmake.org/Wiki/CMake_FAQ
>> >
>> > Follow this link to subscribe/unsubscribe:
>> > http://www.cmake.org/mailman/listinfo/cmake
>>
>> --
>>
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.cmake.org/mailman/listinfo/cmake
> --
>
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake


More information about the CMake mailing list