eProsima / Fast-CDR

eProsima FastCDR library provides two serialization mechanisms. One is the standard CDR serialization mechanism, while the other is a faster implementation of it. Looking for commercial support? Contact info@eprosima.com
Apache License 2.0
134 stars 99 forks source link

Compiling error: function definition is marked dllimport #209

Open felixf4xu opened 1 month ago

felixf4xu commented 1 month ago

Hi,

When fastcdr is compiled and installed, I continue to build fastrtps, (compile on Windows and set -DBUILD_SHARED_LIBS=ON),

then I got lots of similar errors:

C:/ros/jazzy/install/include/fastcdr/Cdr.h:2792:21: error: function 'eprosima::fastcdr::Cdr& eprosima::fastcdr::Cdr::deserialize_type(eprosima::fastcdr::EncodingAlgorithmFlag, std::function<bool(eprosima::fastcdr::Cdr&, const eprosima::fastcdr::MemberId&)>)' definition is marked dllimport
 2792 |     Cdr_DllAPI Cdr& deserialize_type(
      |                     ^~~~~~~~~~~~~~~~

the reason is that when compiled as shared lib (dll on windows), Cdr_DllAPI is defined as __declspec( dllexport ) when compiling fastcdr and __declspec( dllimport ) when compiling fastrtps and includes fastcdr as a shared lib.

Then the included header file (for fastftps), is like this

//Cdr.h
    Cdr_DllAPI Cdr& deserialize_type(
            EncodingAlgorithmFlag type_encoding,
            std::function<bool (Cdr&, const MemberId&)> functor)
    {
        return (this->*deserialize_type_)(type_encoding, functor);
    }

the error message says that the function is marked as dllimport but it has a function body (definition) at the same time, which is an error.

The suggested change is to move the function body/definition from .h file to .cpp file.

I'd like to create a PR if the suggestion above is acceptable.

JesusPoderoso commented 1 month ago

Hi @felixf4xu, thanks for using Fast CDR, and for the report. Sure! Please, go ahead with your contribution!