|
| 1 | +ifndef::include-only-once[] |
| 2 | +:root-path: ../ |
| 3 | +include::{root-path}_config.adoc[] |
| 4 | +endif::[] |
| 5 | + |
| 6 | += Installing _protobuf_ for static / dynamic linking |
| 7 | + |
| 8 | +== Prerequisites |
| 9 | + |
| 10 | +* You have installed _cmake_ (version 3.10.2 or higher). |
| 11 | +* You must have super user privileges. |
| 12 | + |
| 13 | +Static linking is the recommended way to package OSI FMUs for sharing with others to be integrated in a co-simulation: They should have minimal external dependencies, in order to ensure maximum portability. |
| 14 | +Fo other use cases like first trials to get started with OSI, dynamic linking could be an option, as well. |
| 15 | + |
| 16 | +== Windows |
| 17 | + |
| 18 | +**Dynamic Linking (NOT RECOMMENDED)** |
| 19 | + |
| 20 | +Since on windows symbols are not exported per default it can be kind of annoying to deal with this during _protobuf_ header generation (see for example https://groups.google.com/g/protobuf/c/PDR1bqRazts). |
| 21 | +So basically thats one more reason to use static linking. |
| 22 | + |
| 23 | +**Static Linking** |
| 24 | + |
| 25 | +Static linking might require to manually build _protobuf_. |
| 26 | +Its important to notice that on windows you can also specify how to link against the C runtime. |
| 27 | +Basically this can be set in CMake e.g. https://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.html |
| 28 | + |
| 29 | +Therefore, it could make sense to still dynamically link against the C Runtime when statically linking _protobuf_ / OSI. |
| 30 | +(This is important e.g. when building shared libraries, since a static C runtime will create an isolated heap for your dll, which can lead to segfaults depending on what you expose on your public interfaces.) |
| 31 | + |
| 32 | +The easiest way to achieve static linking on Windows without setting all the stuff manually in Cmake and building _protobuf_ is to actually use vcpkg: |
| 33 | + |
| 34 | +**Install static _protobuf_ with dynamic c-runtime with vcpkg:** |
| 35 | + |
| 36 | +---- |
| 37 | +vcpkg install --triplet=x64-windows-static-md protobuf |
| 38 | +---- |
| 39 | + |
| 40 | +**Build:** |
| 41 | + |
| 42 | +For the cmake configuration we can directly specify our vcpkg installation: |
| 43 | +---- |
| 44 | +cmake .. -DVCPKG_TARGET_TRIPLET=x64-windows-static-md -DCMAKE_TOOLCHAIN_FILE=C:/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake -A x64 |
| 45 | +cmake --build . --config Release |
| 46 | +---- |
| 47 | + |
| 48 | +== Linux |
| 49 | + |
| 50 | +**Dynamic linking (NOT RECOMMENDED)** |
| 51 | + |
| 52 | +As already mentioned, shared linking is possible on linux, but NOT RECOMMENDED. |
| 53 | +However, for dynamic linking, install _protobuf_ (version 3.0.0 or higher) with apt: |
| 54 | +---- |
| 55 | +sudo apt-get install libprotobuf-dev protobuf-compiler |
| 56 | +---- |
| 57 | +and in the CMakeLists of the OSI project, `LINK_WITH_SHARED_OSI` has to be enabled. |
| 58 | + |
| 59 | +**Static linking** |
| 60 | + |
| 61 | +A common error here is to just install _protobuf_ with apt and link against it. |
| 62 | +This means that your OSI is build statically but still linking dynamically against _protobuf_. |
| 63 | +Here, again either _protobuf_ has to build statically from source or some solution e.g. vcpkg needs to be utilized. We recommend the following (as in the README of the OSI project): |
| 64 | + |
| 65 | +Install _protobuf_ (version 3.0.0 or higher) from source with `CXXFLAGS="-fPIC"` to allow static linking of your OSI FMUs (replace <version> with preferred release): |
| 66 | +---- |
| 67 | +wget https://github.com/protocolbuffers/protobuf/releases/download/<version>/protobuf-all-<version>.tar.gz |
| 68 | +tar -xzf protobuf-all-<version>.tar.gz |
| 69 | +cd protobuf-<version>/ |
| 70 | +./configure --disable-shared CXXFLAGS="-fPIC" |
| 71 | +make |
| 72 | +sudo make install |
| 73 | +sudo ldconfig |
| 74 | +---- |
0 commit comments