Instructions for building on Windows, closes #15

This commit is contained in:
l0nelyc0w
2023-01-04 07:37:55 -05:00
committed by woodser
parent 773fc51829
commit 0ec3f7f68b
4 changed files with 114 additions and 30 deletions
+47 -10
View File
@@ -2,10 +2,23 @@ list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
cmake_minimum_required(VERSION 3.4.1)
if (WIN32)
# "'sleep_for' is not a member of 'std::this_thread'" in gcc 4.7/4.8
add_definitions( "-D_GLIBCXX_USE_NANOSLEEP=1" )
add_definitions( "-DWIN32_LEAN_AND_MEAN" )
endif()
#target_compile_options(gmock-matchers_test PRIVATE "-Wa,-mbig-obj")
#SET(CMAKE_C_COMPILER /path/to/c/compiler)
#SET(CMAKE_CXX_COMPILER /path/to/cpp/compiler)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F/Library/Frameworks -pthread")
#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
if (WIN32)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj -O2 -fPIC -std=c++14 -F/Library/Frameworks -pthread -lcrypto -lcrypt32")
else()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F/Library/Frameworks -pthread")
endif()
#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-fsanitize=address")
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -F/Library/Frameworks -pthread -fsanitize=address") # TODO: way to enable sanitize? get runtime error with this on
project(MoneroCppLibrary)
@@ -102,12 +115,18 @@ find_package(OpenSSL REQUIRED)
message(STATUS "Using OpenSSL include dir at ${OPENSSL_INCLUDE_DIR}")
include_directories(${OPENSSL_INCLUDE_DIR})
if(STATIC AND NOT IOS)
if(UNIX)
set(OPENSSL_LIBRARIES "${OPENSSL_LIBRARIES};${CMAKE_DL_LIBS};${CMAKE_THREAD_LIBS_INIT}")
endif()
endif()
if (WIN32)
list(APPEND OPENSSL_LIBRARIES ws2_32 crypt32)
endif()
############
# libsodium
############
@@ -173,14 +192,26 @@ set_target_properties(epee PROPERTIES IMPORTED_LOCATION
# Unbound
find_package(Unbound)
include_directories(${UNBOUND_INCLUDE_DIR})
if ("${UNBOUND_LIBRARIES}" MATCHES "libunbound")
message(STATUS "Using libunbound: ${UNBOUND_LIBRARIES}")
add_library(unbound SHARED IMPORTED)
set_target_properties(unbound PROPERTIES IMPORTED_LOCATION
${UNBOUND_LIBRARIES})
if(NOT UNBOUND_INCLUDE_DIR)
die("Could not find libunbound")
else()
message(STATUS "Found libunbound include (unbound.h) in ${UNBOUND_INCLUDE_DIR}")
if(UNBOUND_LIBRARIES)
message(STATUS "Found libunbound library")
include_directories(${UNBOUND_INCLUDE_DIR})
if (WIN32)
add_library(unbound STATIC IMPORTED)
else()
add_library(unbound SHARED IMPORTED)
endif()
set_target_properties(unbound PROPERTIES IMPORTED_LOCATION ${UNBOUND_LIBRARIES})
else()
die("Found libunbound includes, but could not find libunbound library. Please make sure you have installed libunbound or libunbound-dev or the equivalent")
endif()
endif()
add_library(rpc_base STATIC IMPORTED)
set_target_properties(rpc_base PROPERTIES IMPORTED_LOCATION
${MONERO_PROJECT_BUILD}/src/rpc/librpc_base.a)
@@ -371,7 +402,6 @@ if (BUILD_SAMPLE)
multisig
version
randomx
dl
epee
hardforks
cncrypto
@@ -385,7 +415,11 @@ if (BUILD_SAMPLE)
${SODIUM_LIBRARY}
${HIDAPI_LIBRARIES}
${EXTRA_LIBRARIES}
)
if (NOT WIN32)
target_link_libraries(sample_code dl)
endif()
endif()
########################
@@ -420,7 +454,6 @@ if (BUILD_SCRATCHPAD)
multisig
version
randomx
dl
epee
hardforks
cncrypto
@@ -435,4 +468,8 @@ if (BUILD_SCRATCHPAD)
${HIDAPI_LIBRARIES}
${EXTRA_LIBRARIES}
)
if (NOT WIN32)
target_link_libraries(sample_code dl)
endif()
endif()
+37 -1
View File
@@ -207,6 +207,42 @@ For example, [monero-java](https://github.com/monero-ecosystem/monero-java) comp
5. Build monero-project to create .a libraries, e.g.: `make release-static -j8`
6. Link to this library's source files in your application or build as a shared library in ./build/: `cd $MONERO_CPP && ./bin/build_libmonero_cpp.sh`
## Instructions for building libmonero-cpp.dll on Windows
1. Download and install [MSYS2](https://www.msys2.org/).
2. Press windows button and type ```MSYS2 MINGW64``` for 64 bit systems or ```MSYS2 MINGW32``` for 32 bit.
3. Update packages:
```pacman -Syu```
4. Install dependencies
For 64 bit
```
pacman -S mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-unbound mingw-w64-x86_64-protobuf git mingw-w64-x86_64-libusb
```
For 32 bit
```
pacman -S mingw-w64-i686-toolchain make mingw-w64-i686-cmake mingw-w64-i686-boost mingw-w64-i686-openssl mingw-w64-i686-zeromq mingw-w64-i686-libsodium mingw-w64-i686-hidapi mingw-w64-i686-unbound mingw-w64-i686-protobuf git mingw-w64-i686-libusb
```
5. Clone repo
```
git clone --recurse-submodules https://github.com/monero-ecosystem/monero-cpp.git
```
6. Update submodules
```
cd ./monero-cpp && ./bin/update_submodules.sh
```
7. ```export MONERO_CPP=path/to/monero-cpp```
8. ```cd $MONERO_CPP/external/monero-project```
9. Build monero-project for 64 bit
```
make release-static-win64
```
or for 32 bit
```
make release-static-win32
```
10. Build as a shared library in ./build/:
```cd $MONERO_CPP && ./bin/build_libmonero_cpp_dll.sh```
## Related projects
* [monero-java](https://github.com/monero-ecosystem/monero-java)
@@ -223,4 +259,4 @@ If this library brings you value, please consider donating.
<p align="center">
<img src="donate.png" width="115" height="115"/><br>
<code>46FR1GKVqFNQnDiFkH7AuzbUBrGQwz2VdaXTDD4jcjRE8YkkoTYTmZ2Vohsz9gLSqkj5EM6ai9Q7sBoX4FPPYJdGKQQXPVz</code>
</p>
</p>
+10
View File
@@ -0,0 +1,10 @@
#!/bin/sh
HOST_NCORES=$(nproc 2>/dev/null || shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
# build libmonero-cpp shared library
mkdir -p build &&
cd build &&
cmake .. &&
cmake --build . &&
make .
+20 -19
View File
@@ -44,7 +44,7 @@
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* strict LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
@@ -52,6 +52,12 @@
#include "monero_wallet_full.h"
#ifdef WIN32_LEAN_AND_MEAN
#include <boost/locale.hpp>
#include <boost/filesystem.hpp>
#include <thread>
#endif
#include "utils/monero_utils.h"
#include <chrono>
#include <iostream>
@@ -62,11 +68,6 @@
#include "serialization/string.h"
#include "common/threadpool.h"
#ifdef WIN32
#include <boost/locale.hpp>
#include <boost/filesystem.hpp>
#endif
using namespace tools;
/**
@@ -77,7 +78,7 @@ namespace monero {
// ------------------------- INITIALIZE CONSTANTS ---------------------------
static const int DEFAULT_CONNECTION_TIMEOUT_MILLIS = 1000 * 30; // default connection timeout 30 sec
static const bool STRICT = false; // relies exclusively on blockchain data if true, includes local wallet data if false TODO: good use case to expose externally?
static const bool strict = false; // relies exclusively on blockchain data if true, includes local wallet data if false TODO: good use case to expose externally?
// ----------------------- INTERNAL PRIVATE HELPERS -----------------------
@@ -1589,29 +1590,29 @@ namespace monero {
// isMultisigImportNeeded
uint64_t monero_wallet_full::get_balance() const {
return m_w2->balance_all(STRICT);
return m_w2->balance_all(strict);
}
uint64_t monero_wallet_full::get_balance(uint32_t account_idx) const {
return m_w2->balance(account_idx, STRICT);
return m_w2->balance(account_idx, strict);
}
uint64_t monero_wallet_full::get_balance(uint32_t account_idx, uint32_t subaddress_idx) const {
std::map<uint32_t, uint64_t> balance_per_subaddress = m_w2->balance_per_subaddress(account_idx, STRICT);
std::map<uint32_t, uint64_t> balance_per_subaddress = m_w2->balance_per_subaddress(account_idx, strict);
auto iter = balance_per_subaddress.find(subaddress_idx);
return iter == balance_per_subaddress.end() ? 0 : iter->second;
}
uint64_t monero_wallet_full::get_unlocked_balance() const {
return m_w2->unlocked_balance_all(STRICT);
return m_w2->unlocked_balance_all(strict);
}
uint64_t monero_wallet_full::get_unlocked_balance(uint32_t account_idx) const {
return m_w2->unlocked_balance(account_idx, STRICT);
return m_w2->unlocked_balance(account_idx, strict);
}
uint64_t monero_wallet_full::get_unlocked_balance(uint32_t account_idx, uint32_t subaddress_idx) const {
std::map<uint32_t, std::pair<uint64_t, std::pair<uint64_t, uint64_t>>> unlocked_balance_per_subaddress = m_w2->unlocked_balance_per_subaddress(account_idx, STRICT);
std::map<uint32_t, std::pair<uint64_t, std::pair<uint64_t, uint64_t>>> unlocked_balance_per_subaddress = m_w2->unlocked_balance_per_subaddress(account_idx, strict);
auto iter = unlocked_balance_per_subaddress.find(subaddress_idx);
return iter == unlocked_balance_per_subaddress.end() ? 0 : iter->second.first;
}
@@ -1629,8 +1630,8 @@ namespace monero {
monero_account account;
account.m_index = account_idx;
account.m_primary_address = get_address(account_idx, 0);
account.m_balance = m_w2->balance(account_idx, STRICT);
account.m_unlocked_balance = m_w2->unlocked_balance(account_idx, STRICT);
account.m_balance = m_w2->balance(account_idx, strict);
account.m_unlocked_balance = m_w2->unlocked_balance(account_idx, strict);
if (include_subaddresses) account.m_subaddresses = get_subaddresses_aux(account_idx, std::vector<uint32_t>(), transfers);
accounts.push_back(account);
}
@@ -1649,8 +1650,8 @@ namespace monero {
monero_account account;
account.m_index = account_idx;
account.m_primary_address = get_address(account_idx, 0);
account.m_balance = m_w2->balance(account_idx, STRICT);
account.m_unlocked_balance = m_w2->unlocked_balance(account_idx, STRICT);
account.m_balance = m_w2->balance(account_idx, strict);
account.m_unlocked_balance = m_w2->unlocked_balance(account_idx, strict);
if (include_subaddresses) account.m_subaddresses = get_subaddresses_aux(account_idx, std::vector<uint32_t>(), transfers);
return account;
}
@@ -3696,8 +3697,8 @@ namespace monero {
std::vector<monero_subaddress> subaddresses;
// get balances per subaddress as maps
std::map<uint32_t, uint64_t> balance_per_subaddress = m_w2->balance_per_subaddress(account_idx, STRICT);
std::map<uint32_t, std::pair<uint64_t, std::pair<uint64_t, uint64_t>>> unlocked_balance_per_subaddress = m_w2->unlocked_balance_per_subaddress(account_idx, STRICT);
std::map<uint32_t, uint64_t> balance_per_subaddress = m_w2->balance_per_subaddress(account_idx, strict);
std::map<uint32_t, std::pair<uint64_t, std::pair<uint64_t, uint64_t>>> unlocked_balance_per_subaddress = m_w2->unlocked_balance_per_subaddress(account_idx, strict);
// get all indices if no indices given
std::vector<uint32_t> subaddress_indices_req;