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

Conversion across modules #4

Closed
mrzv opened this issue Oct 21, 2015 · 3 comments
Closed

Conversion across modules #4

mrzv opened this issue Oct 21, 2015 · 3 comments

Comments

@mrzv
Copy link

mrzv commented Oct 21, 2015

The following works on Mac OS X, but not on Linux. (The obvious bits below, declarations of m and such, are ommited.)

// common.h

struct A {};
// a.cpp

#include "common.h"

PYBIND11_PLUGIN(a)
{
  py::class_<A>(m, "A")
      .def(py::init<>());
}
// b.cpp

#include "common.h"

PYBIND11_PLUGIN(b)
{
  m.def("test", [](A a) { fmt::print("test\n"); });
}
# test.py 

import a
import b

x = a.A()
b.test(x)

On Mac, this works fine. On Linux, I get:

TypeError: Incompatible function arguments. The following argument types are supported:
    1. (A) -> None
wjakob pushed a commit that referenced this issue Oct 22, 2015
wjakob pushed a commit that referenced this issue Oct 22, 2015
@wjakob
Copy link
Member

wjakob commented Oct 22, 2015

Hi Dmitriy,

it's a consequence of typeid(A) in a.cpp giving a different answer than in b.cpp. It would probably not have happened if "A" was defined in some shared libraries that both a.cpp and b.cpp link against.

That said, I have committed a simple workaround that should allow this case to work nonetheless. Can you verify that it works on your end?

-Wenzel

@mrzv
Copy link
Author

mrzv commented Oct 22, 2015

Yup, that fixed it. Thanks.

@wjakob
Copy link
Member

wjakob commented Oct 22, 2015

great, thanks.

@wjakob wjakob closed this as completed Oct 22, 2015
nbigaouette pushed a commit to nbigaouette/pybind11 that referenced this issue Jan 12, 2016
This should insure that both the PythonLibs and PythonInterp points to
the same python version.

Without this, the Python library and interpreter might not match version.
For example, if both Python 2.7 and 3.4 is installed, PythonLibs will
find /usr/lib/x86_64-linux-gnu/libpython3.4m.so while
PythonInterp will find /usr/bin/python2.7 (at least on Ubuntu 14.04).

When PythonLibs and PythonInterp don't point to the same Python version,
the examples will all fail:

$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- 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
-- Setting build type to 'MinSizeRel' as none was specified.
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.4m.so (found suitable version "3.4.3", minimum required is "2.7")
-- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7")
-- Performing Test HAS_LTO_FLAG
-- Performing Test HAS_LTO_FLAG - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/nbigaouette/pybind11/build
$ make test
Running tests...
Test project /home/nbigaouette/pybind11/build
      Start  1: example1
 1/12 Test  pybind#1: example1 .........................***Failed    0.02 sec
      Start  2: example2
 2/12 Test  pybind#2: example2 .........................***Failed    0.03 sec
      Start  3: example3
 3/12 Test  pybind#3: example3 .........................***Failed    0.02 sec
      Start  4: example4
 4/12 Test  pybind#4: example4 .........................***Failed    0.02 sec
      Start  5: example5
 5/12 Test  pybind#5: example5 .........................***Failed    0.02 sec
      Start  6: example6
 6/12 Test  pybind#6: example6 .........................***Failed    0.02 sec
      Start  7: example7
 7/12 Test  pybind#7: example7 .........................***Failed    0.02 sec
      Start  8: example8
 8/12 Test  pybind#8: example8 .........................***Failed    0.02 sec
      Start  9: example9
 9/12 Test  pybind#9: example9 .........................***Failed    0.02 sec
      Start 10: example10
10/12 Test pybind#10: example10 ........................***Failed    0.02 sec
      Start 11: example11
11/12 Test pybind#11: example11 ........................***Failed    0.03 sec
      Start 12: example12
12/12 Test pybind#12: example12 ........................***Failed    0.02 sec

0% tests passed, 12 tests failed out of 12

Total Test time (real) =   0.25 sec

The following tests FAILED:
          1 - example1 (Failed)
          2 - example2 (Failed)
          3 - example3 (Failed)
          4 - example4 (Failed)
          5 - example5 (Failed)
          6 - example6 (Failed)
          7 - example7 (Failed)
          8 - example8 (Failed)
          9 - example9 (Failed)
         10 - example10 (Failed)
         11 - example11 (Failed)
         12 - example12 (Failed)
Errors while running CTest
make: *** [test] Error 8


By adding the EXACT version to the find_package() calls, the version
discrepency is at least caught at the cmake call:

$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- 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
-- Setting build type to 'MinSizeRel' as none was specified.
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find PythonLibs: Found unsuitable version "3.4.3", but required
  is exact version "2.7" (found /usr/lib/x86_64-linux-gnu/libpython3.4m.so)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:313 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindPythonLibs.cmake:208 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:27 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/nbigaouette/pybind11/build/CMakeFiles/CMakeOutput.log".
nbigaouette pushed a commit to nbigaouette/pybind11 that referenced this issue Jan 12, 2016
…ts to

the same python version.

Without this, the Python library and interpreter might not match version.
For example, if both Python 2.7 and 3.4 is installed, `PythonLibs` will
find /usr/lib/x86_64-linux-gnu/libpython3.4m.so while
`PythonInterp` will find /usr/bin/python2.7 (at least on Ubuntu 14.04).

When `PythonLibs` and `PythonInterp` don't point to the same Python version,
the examples will all fail:

```bash
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- 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
-- Setting build type to 'MinSizeRel' as none was specified.
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.4m.so (found suitable version "3.4.3", minimum required is "2.7")
-- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7")
-- Performing Test HAS_LTO_FLAG
-- Performing Test HAS_LTO_FLAG - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/nbigaouette/pybind11/build
$ make test
Running tests...
Test project /home/nbigaouette/pybind11/build
      Start  1: example1
 1/12 Test  pybind#1: example1 .........................***Failed    0.02 sec
      Start  2: example2
 2/12 Test  pybind#2: example2 .........................***Failed    0.03 sec
      Start  3: example3
 3/12 Test  pybind#3: example3 .........................***Failed    0.02 sec
      Start  4: example4
 4/12 Test  pybind#4: example4 .........................***Failed    0.02 sec
      Start  5: example5
 5/12 Test  pybind#5: example5 .........................***Failed    0.02 sec
      Start  6: example6
 6/12 Test  pybind#6: example6 .........................***Failed    0.02 sec
      Start  7: example7
 7/12 Test  pybind#7: example7 .........................***Failed    0.02 sec
      Start  8: example8
 8/12 Test  pybind#8: example8 .........................***Failed    0.02 sec
      Start  9: example9
 9/12 Test  pybind#9: example9 .........................***Failed    0.02 sec
      Start 10: example10
10/12 Test pybind#10: example10 ........................***Failed    0.02 sec
      Start 11: example11
11/12 Test pybind#11: example11 ........................***Failed    0.03 sec
      Start 12: example12
12/12 Test pybind#12: example12 ........................***Failed    0.02 sec

0% tests passed, 12 tests failed out of 12

Total Test time (real) =   0.25 sec

The following tests FAILED:
          1 - example1 (Failed)
          2 - example2 (Failed)
          3 - example3 (Failed)
          4 - example4 (Failed)
          5 - example5 (Failed)
          6 - example6 (Failed)
          7 - example7 (Failed)
          8 - example8 (Failed)
          9 - example9 (Failed)
         10 - example10 (Failed)
         11 - example11 (Failed)
         12 - example12 (Failed)
Errors while running CTest
make: *** [test] Error 8
```

By adding the `EXACT` version to the `find_package()` calls, the version
discrepancy is at least caught at the cmake call:

```bash
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- 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
-- Setting build type to 'MinSizeRel' as none was specified.
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find PythonLibs: Found unsuitable version "3.4.3", but required
  is exact version "2.7" (found /usr/lib/x86_64-linux-gnu/libpython3.4m.so)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:313 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindPythonLibs.cmake:208 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:27 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/nbigaouette/pybind11/build/CMakeFiles/CMakeOutput.log".
```
nbigaouette pushed a commit to nbigaouette/pybind11 that referenced this issue Jan 12, 2016
This should insure that both the `PythonLibs` and `PythonInterp` points to
the same python version.

Without this, the Python library and interpreter might not match version.
For example, if both Python 2.7 and 3.4 is installed, `PythonLibs` will
find /usr/lib/x86_64-linux-gnu/libpython3.4m.so while
`PythonInterp` will find /usr/bin/python2.7 (at least on Ubuntu 14.04).

When `PythonLibs` and `PythonInterp` don't point to the same Python version,
the examples will all fail:

```bash
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- 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
-- Setting build type to 'MinSizeRel' as none was specified.
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.4m.so (found suitable version "3.4.3", minimum required is "2.7")
-- Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7")
-- Performing Test HAS_LTO_FLAG
-- Performing Test HAS_LTO_FLAG - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/nbigaouette/pybind11/build
$ make test
Running tests...
Test project /home/nbigaouette/pybind11/build
      Start  1: example1
 1/12 Test  pybind#1: example1 .........................***Failed    0.02 sec
      Start  2: example2
 2/12 Test  pybind#2: example2 .........................***Failed    0.03 sec
      Start  3: example3
 3/12 Test  pybind#3: example3 .........................***Failed    0.02 sec
      Start  4: example4
 4/12 Test  pybind#4: example4 .........................***Failed    0.02 sec
      Start  5: example5
 5/12 Test  pybind#5: example5 .........................***Failed    0.02 sec
      Start  6: example6
 6/12 Test  pybind#6: example6 .........................***Failed    0.02 sec
      Start  7: example7
 7/12 Test  pybind#7: example7 .........................***Failed    0.02 sec
      Start  8: example8
 8/12 Test  pybind#8: example8 .........................***Failed    0.02 sec
      Start  9: example9
 9/12 Test  pybind#9: example9 .........................***Failed    0.02 sec
      Start 10: example10
10/12 Test pybind#10: example10 ........................***Failed    0.02 sec
      Start 11: example11
11/12 Test pybind#11: example11 ........................***Failed    0.03 sec
      Start 12: example12
12/12 Test pybind#12: example12 ........................***Failed    0.02 sec

0% tests passed, 12 tests failed out of 12

Total Test time (real) =   0.25 sec

The following tests FAILED:
          1 - example1 (Failed)
          2 - example2 (Failed)
          3 - example3 (Failed)
          4 - example4 (Failed)
          5 - example5 (Failed)
          6 - example6 (Failed)
          7 - example7 (Failed)
          8 - example8 (Failed)
          9 - example9 (Failed)
         10 - example10 (Failed)
         11 - example11 (Failed)
         12 - example12 (Failed)
Errors while running CTest
make: *** [test] Error 8
```

By adding the `EXACT` version to the `find_package()` calls, the version
discrepancy is at least caught at the cmake call:

```bash
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- 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
-- Setting build type to 'MinSizeRel' as none was specified.
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find PythonLibs: Found unsuitable version "3.4.3", but required
  is exact version "2.7" (found /usr/lib/x86_64-linux-gnu/libpython3.4m.so)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:313 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindPythonLibs.cmake:208 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:27 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/nbigaouette/pybind11/build/CMakeFiles/CMakeOutput.log".
```
wjakob pushed a commit that referenced this issue Oct 15, 2016
Accept any sequence type as std::vector
EricCousineau-TRI referenced this issue in EricCousineau-TRI/pybind11 Jan 5, 2018
Handle case if unique_ptr is None / nullptr.
EricCousineau-TRI referenced this issue in EricCousineau-TRI/pybind11 Apr 10, 2018
EricCousineau-TRI referenced this issue in EricCousineau-TRI/pybind11 Apr 11, 2018
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

2 participants