Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build lib and dll with vs2015 under win64 #557

Open
YiGene opened this issue Aug 26, 2020 · 15 comments
Open

build lib and dll with vs2015 under win64 #557

YiGene opened this issue Aug 26, 2020 · 15 comments
Assignees

Comments

@YiGene
Copy link

YiGene commented Aug 26, 2020

it take me some time to get it build to 64bit under 2015 hence i put a note here

after we choose x64 to debug and release, run build
image

we see below errors:
1> d:\modbus\libmodbus-3.1.6\src\modbus.h(228): note: see previous definition of 'modbus_mapping_free'
1> Generating Code...
1> Link:
1> Creating library D:\modbus\libmodbus-3.1.6\src\win32\x64\Debug\modbus.lib and object D:\modbus\libmodbus-3.1.6\src\win32\x64\Debug\modbus.exp
1> 1>
1>modbus-rtu.obj : warning LNK4217: locally defined symbol modbus_free imported in function modbus_new_rtu
1> 1>
1>modbus-tcp.obj : warning LNK4217: locally defined symbol modbus_free imported in function _modbus_tcp_init_win32
1> 1>
1>modbus.obj : warning LNK4217: locally defined symbol modbus_set_bits_from_bytes imported in function modbus_reply
1> 1>
1>modbus-data.obj : error LNK2019: unresolved external symbol __imp_htonl referenced in function modbus_set_float_abcd
1> 1>

add ws2_32.lib
image

build success

modbus.obj : warning LNK4217: locally defined symbol modbus_set_bits_from_bytes imported in function modbus_reply
1> modbus.vcxproj -> D:\modbus\libmodbus-3.1.6\src\win32\x64\Debug\modbus.dll
1> modbus.vcxproj -> D:\modbus\libmodbus-3.1.6\src\win32\x64\Debug\modbus.pdb (Full PDB)
1> FinalizeBuildStatus:
1> Deleting file "x64\Debug\modbus.tlog\unsuccessfulbuild".
1> Touching "x64\Debug\modbus.tlog\modbus.lastbuildstate".
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:12.33
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

**PLEASE NOTE i didn't test the function, just build it **

@AndoniC
Copy link

AndoniC commented Oct 21, 2020

Hi YiGene,
Related to this I wrote this simple CMakelists.txt in order to create Visual Studio solutions using CMake tool and it seems it can also be compiled and it works ok, just if it is of interest.

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)

#include("./TargetArch.cmake")
#target_architecture (TARGET_COMPILATION_ARCH)
#check : IF(TARGET_COMPILATION_ARCH MATCHES x86_64)
#message(STATUS "** Compilation Target is ${TARGET_COMPILATION_ARCH} bits **")

PROJECT (modbus)

#Version
SET( modbus_VERSION_MAJOR 1 )
SET( modbus_VERSION_MINOR 1 )
SET( modbus_VERSION_PATCH 0 )
SET( modbus_VERSION_STATUS "dev") 
SET( modbus_PROJECT_VERSION ${modbus_VERSION_MAJOR}.${modbus_VERSION_MINOR}.${modbus_VERSION_PATCH}-${modbus_VERSION_STATUS})

#Set folders in Visual studio
set_property( GLOBAL PROPERTY USE_FOLDERS On)

#Source files
FILE (GLOB sources "src/*.h" "src/*.c")

#Create config.h from config.h.win32
CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/src/config.h.win32" "${PROJECT_BINARY_DIR}/config.h" @ONLY)
#Include the directory containing config.h in include directories list
include_directories(${PROJECT_BINARY_DIR})

#add target 
add_library(modbus SHARED ${sources} "${PROJECT_BINARY_DIR}/config.h")

#add ws2_32 library
target_link_libraries(modbus ws2_32 )

#add preprocessor directives 
target_compile_definitions( modbus PUBLIC  "-DDLLBUILD")
target_compile_definitions( modbus PUBLIC  "MODBUS_VERSION=${modbus_PROJECT_VERSION}")
CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/config.cmake.in" "${PROJECT_BINARY_DIR}/modbusConfig.cmake" @ONLY)

config.cmake.in is the file used to create modbusConfig.cmake (used by FindPackage to generate configuration variables). Here the content:

#This file will define the following variables:
#    - modbus_LIBRARIES        : The list of libraries to links against.
#    - modbus_INCLUDE_DIRS  : The directory where include files are.
 
#    - modbus_VERSION       : The  version of this build. Example: "1.2.0"
#    - modbus_VERSION_MAJOR : Major version part of VERSION. Example: "1"
#    - modbus_VERSION_MINOR : Minor version part of VERSION. Example: "2"
#    - modbus_VERSION_PATCH : Patch version part of VERSION. Example: "0"

set (modbus_INCLUDE_DIRS "@PROJECT_BINARY_DIR@" "@PROJECT_SOURCE_DIR@/src")
set (modbus_LIB_DIR  "@PROJECT_BINARY_DIR@/$(Configuration)")
set(modbus_LIBRARIES debug @PROJECT_BINARY_DIR@/Debug/modbusd.lib optimized @PROJECT_BINARY_DIR@/Release/modbus.lib)
set(modbus_VERSION 		  @modbus_VERSION@)
set(modbus_VERSION_MAJOR  @modbus_VERSION_MAJOR@)
set(modbus_VERSION_MINOR  @modbus_VERSION_MINOR@)
set(modbus_VERSION_PATCH  @modbus_VERSION_PATCH@)

#Usage from an external project:
#    In your CMakeLists.txt, add these lines:
#         FIND_PACKAGE(modbus REQUIRED )
#         INCLUDE_DIRECTORIES(${modbus_INCLUDE_DIRS})
#         TARGET_LINK_LIBRARIES(TARGET_NAME ${modbus_LIBRARIES})

@stephane stephane self-assigned this Nov 28, 2022
@stephane
Copy link
Owner

Related to 9a7ea12

@msk-repo-0x4d
Copy link

Hi @stephane and everyone.
I have compiled and used this library in both Windows and Linux. I found that the README file for Windows (inside src/win32 folder) is not complete as it does not tell the user how to create a dll out of this. For creating dll I had to add "__declspec(dllexport)" to all the functions that I used in my code.

I am not sure if you consider this useful but if you do then I am ready to volunteer to make the README file bigger with steps to create a dll file.

Just to elaborate I added a Macros DLL_EXPORT in modbus.h file as below:

#ifdef _WIN32
    #define DLL_EXPORT __declspec(dllexport)
#endif

And then in appropriate header file I added this DLL_EXPORT to all the important methods that should be exported. One Example is shown :

MODBUS_API modbus_t * DLL_EXPORT
modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop_bit);

Let me know what you think of this making README more elaborative!

@stephane
Copy link
Owner

Yes please, this would be very useful information.

@msk-repo-0x4d
Copy link

msk-repo-0x4d commented Apr 19, 2023

@stephane I just created a pull request (#697) after making changes. Let me know if there is something I have to explain better. Also, I left the Visual Studio part as it is, as I can't test it on my system (my system is running low on storage space).

@msk-repo-0x4d
Copy link

Hi @stephane. Did you get a chance to look at the new README for Windows (under src/win32)?

@ottelo9
Copy link

ottelo9 commented May 12, 2023

Why no one can leave the build dll files here so that we can download them? Rights problems? Can anyone please upload it? THX

@msk-repo-0x4d
Copy link

@ottelo9 Check the wiki page of this project. They have mentioned a google-drive link to share it. Navigate here in case you are having difficulty:
https://github.com/stephane/libmodbus/wiki/Compile-dll-under-Windows-with-Visual-Studio-2008-Express#ready-to-use-dll

@ottelo9
Copy link

ottelo9 commented May 17, 2023

thanks for your answer. That is my dll that I uploaded few years ago 😂😂😂. Yesterday I compiled v3.1.10. I will upload it again and put it on wiki.

@luocheng610
Copy link

thanks for your answer. That is my dll that I uploaded few years ago 😂😂😂. Yesterday I compiled v3.1.10. I will upload it again and put it on wiki.

It seems that the 64-bit version cannot be compiled. I can compile the 32-bit version. Can you compile the 64-bit version of the DLL?

@ottelo9
Copy link

ottelo9 commented Sep 19, 2023

@luocheng610
I use Visual Studio 2008 Express. I can only compile win32 versions. I dont know how to compile 64Bit :( . But please! If anyone can share a 64Bit libmodbus, please do it.

@luocheng610
Copy link

@luocheng610 I use Visual Studio 2008 Express. I can only compile win32 versions. I dont know how to compile 64Bit :( . But please! If anyone can share a 64Bit libmodbus, please do it.

No problem, I'll upload it
libmodbus-3.1.10_VS2008_X64.zip

@ottelo9
Copy link

ottelo9 commented Sep 20, 2023

@luocheng610
Thanks. I put it to the Wiki.

@AbhishekBade1310
Copy link

i want to make a dll with libmodbus and then use that dll in c#. the issue I'm facing is that when i change the "common language runtime" support field in config properties-->advanced so the dll can be called in c#, it throws error saying that the .c files can't be used.

WhatsApp Image 2024-06-18 at 9 10 33 AM

@AbhishekBade1310
Copy link

Hi @msk-repo-0x4d im trying to make a dll with libmodbus in c++ and then run that dll in c# but im facing a lot of errors could you pls help me tackle them? my email is: [email protected].

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants